多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 终端 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。 默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。 信号中还讲过,在控制终端输入一些特殊的控制键可以给前台进程发信号,例如Ctrl+C表示SIGINT,Ctrl+\\表示SIGQUIT。 ~~~ #include <unistd.h> ​ char *ttyname(int fd); 功能:由文件描述符查出对应的文件名 参数: fd:文件描述符 返回值: 成功:终端名 失败:NULL ~~~ ~~~ #include <unistd.h> #include <stdio.h> int main() { printf("fd 0: %s\n", ttyname(0)); printf("fd 1: %s\n", ttyname(1)); printf("fd 2: %s\n", ttyname(2)); return 0; } ~~~ # 进程组 进程组,也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。**代表一个或多个进程的集合。** 每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了简化对多个进程的管理。 当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID为第一个进程ID(组长进程)。所以,组长进程标识:其进程组ID为其进程ID 可以使用**kill -SIGKILL -进程组ID**(负的)来将整个进程组内的进程全部杀死: ![](https://img.kancloud.cn/62/b6/62b69c3d9cfd7b3fb9cb1b34462de6d3_798x222.png) 组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。 进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)。 一个进程可以为自己或子进程设置进程组ID。 # 相关函数 ~~~ #include <unistd.h> ​ pid_t getpgrp(void); /* POSIX.1 version */ 功能:获取当前进程的进程组ID 参数:无 返回值:总是返回调用者的进程组ID ​ pid_t getpgid(pid_t pid); 功能:获取指定进程的进程组ID 参数: pid:进程号,如果pid = 0,那么该函数作用和getpgrp一样 返回值: 成功:进程组ID 失败:-1 ​ int setpgid(pid_t pid, pid_t pgid); 功能: 改变进程默认所属的进程组。通常可用来加入一个现有的进程组或创建一个新进程组。 参数: 将参1对应的进程,加入参2对应的进程组中 返回值: 成功:0 失败:-1 ~~~