当前位置:嗨网首页>书籍在线阅读

06-前台和后台进程组

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

34.5 前台和后台进程组

控制终端保留了前台进程组的概念。在一个会话中,在同一时刻只有一个进程能成为前台进程,会话中的其他所有进程都是后台进程组。前台进程组是唯一能够自由地读取和写入控制终端的进程组。当在控制终端中输入其中一个信号生成终端字符之后,终端驱动器会将相应的信号发送给前台进程组的成员。34.7节将会对此进行深入介绍。

从理论上来讲,可能会出现一个会话没有前台进程组的情况。如当前台进程组中的所有进程都终止并且没有其他进程注意到这个事实而将自己移动到前台时就会出现这种情况。但在实践中这种情况是比较少见的。通常shell进程会监控前台进程组的状态,当它注意到前台进程组结束之后(通过wait())会将自己移动到前台。

tcgetpgrp()和tcsetpgrp()函数分别获取和修改一个终端的进程组。这些函数主要供任务控制shell使用。

882.png tcgetpgrp()函数返回文件描述符fd所指定的终端的前台进程组的进程组ID,该终端必须是调用进程的控制终端。

如果这个终端没有前台进程组,那么tcgetpgrp()返回一个大于1并且与所有既有进程组ID都不匹配的值。(SUSv3规定了这种行为。)

tcsetpgrp()函数修改一个终端的前台进程组。如果调用进程拥有一个控制终端,那么文件描述符fd引用的就是那个终端,接着tcsetpgrp()会将终端的前台进程组设置为pgid参数指定的进程组,该参数必须与调用进程所属的会话中的一个进程的进程组ID匹配。

tcgetpgrp() 和 tcsetpgrp()在SUSv3中都被标准化了。在Linux上,与很多其他UNIX实现一样,这些函数是通过两个非标准的ioctl()操作来实现的,即TIOCGPGRP和TIOCSPGRP。