UNIX进程组,会话和作业控制.docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UNIX进程组,会话和作业控制

UNIX进程组,会话和作业控制2011-07-23javascript:void(0);0/os/201107/97361.html?个评论 javascript:;收藏 /index.php?m=memberc=contenta=publishmodid=1siteid=1我要投稿 ?1. 进程组、会话与终端(1).每个进程都属于一个进程组。进程组是一个或多个进程的集合,通常它们与一组作业相关联,可以接受来自同一终端的各种信号。每个进程组都有唯一的进程组ID(整数,也可以存放在pid_t类型中)。 #include unistd.h pid_t getpgrp(void); //返回值;调用进程的进程组ID 每个进程组都有一个组长进程,组长进程的标识是进程组ID等于其进程ID。组长进程可以创建一个进程组、创建该组中的进程。只有某个进程中有一个进程存在,则该进程就存在,与组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间成为进程组的生存期。进程组中最后一个进程可以终止或者转移到另一个进程组中。 进程调用setpgid(setsid也可以)可以参加一个现存的组或者创建一个新进程组 #include sys/types.h #include unistd.h int setpgid(pid_t pid, pid_t pgid); //返回:若成功则为0,出错为-1 这将pid进程的进程组ID设置为pgid。如果pid是0,则使用调用者的进程ID。另外,如果pgid是0,则由pid指定的进程ID被用作为进程组ID。如果这两个参数相等,则由pid指定的进程变成进程组组长。 一个进程只能为它自己或它的子进程设置进程组I D。在它的子进程调用了exec后,它就不再能改变该子进程的进程组I D。 在大多数作业控制shell中,在fork之后调用此函数,使父进程设置其子进程的进程组ID,然后使子进程设置其自己的进程组ID。这些调用中有一个是冗余的,但这样做可以保证父、子进程在进一步操作之前,子进程都进入了该进程组。否则依赖于哪一个进程先执行,就产生一个竞态条件。(2).session是一个或多个进程组的集合。? 例如,在shell中: $proc1 | proc2 $proc3 | proc4?那么此时,session中就会有三个进程组存在,分别是{登陆shell(session leader)},{proc1, proc2}, {proc3, proc4}。 进程调用setsid函数就可建立一个新对话期。 #include sys/types.h #include unistd.h pid_t setsid(void); 如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新对话期,结果为:(a) 此进程变成该新对话期的对话期首进程(session leader,对话期首进程是创建该对话期的进程)。此进程是该新对话期中的唯一进程。(b) 此进程成为一个新进程组的组长进程。新进程组ID是此调用进程的进程ID。(c) 此进程没有控制终端。如果在调用setsid之前此进程有一个控制终端,那么这种联系也被解除。 如果此调用进程已经是一个进程组的组长,则此函数返回出错。为了保证不处于这种情况,通常先调用fork,然后使其父进程终止,而子进程则继续。因为子进程继承了父进程的进程组ID,而其进程ID则是新分配的,两者不可能相等,所以这就保证了子进程不是一个进程组的组长。 对话期和进程组有一些其他特性: ? 一个对话期可以有一个单独的控制终端(controlling terminal)。这通常是我们在其上登录的终端设备(终端登录情况)或伪终端设备(网络登录情况)。 ? 建立与控制终端连接的对话期首进程,被称之为控制进程(controlling process)。 ? 一个对话期中的几个进程组可被分成一个前台进程组(foreground process group)以及一个或几个后台进程组(background process group)。前台进程组接受终端输入信号。Shell中的作业控制就是对前后台进程组的控制,或Ctrl+Z的进程组就是后台进程组。 ? 如果一个对话期有一个控制终端,则它有一个前台进程组,其他进程组则为后台进程组。 ? 无论何时键入中断键(常常是DELETE或Ctrl-C)或退出键(常常是Ctrl-\),就会造成将中断信号或退出信号送至前台进程组的所有进程。 ? 终端的挂断信号送至控制进程(对话期首进程。) ? 系统在登陆时将自动建立控制终端。 如何分配一个控制终端依赖于实现。在open时,有几个和控制终端相关的选项:O_NOCTTY 如果要打开的文件为终端机设备时,则不会将该终端当成进程控制终端。 有

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档