跟scz学写daemon
时间:2007-05-10 来源:Elite
支持作业控制的现代shell对&的解释一般都是 fork/setpgid。前台进程组、后台进程组是终端的属性,不是进程本身的属性。
非作业控制型shell对&的解释一般只是fork,没有setpgid,这样启动的进程与shell属于同一进程组。
后面讨论都假设是用支持作业控制的shell。
在控制终端按下ctrl-c,终端驱动程序产生SIGINT信号并分发至前台进程组所有进程。
APUE提到,当session leader终止时,系统会向该session前台进程组中所有进程分发SIGHUP信号,按照惯例意味着“终端线路被挂断”,与父进程无关。在以下两种情况下SIGHUP会在一个进程死时发送:
1. 当一个终端设备与一个会话相关联,而这个会话的leader死时,SIGHUP会被发送至这个终端设备的所有前台进程组。
2. 当一个进程死去导致一个进程组变成孤儿,而且该进程组里一个或多个进程处于“暂停”状态时,SIGHUP和SIGCONT被发送至这个孤儿进程组的所有成员进程。
如果某进程组中有一个进程,其父进程属于同一session的另一个进程组,则该进程组不是“孤儿进程组”,反之该进程组称为“孤儿进程组”。
setsid()如果成功,产生3个结果:
1. 创建一个新的session,当前进程成为session leader,也是新的session中的唯一进程。
2. 当前进程成为一个新进程组的组长。这个进程组何时创建?
3. 如果当前进程以前有一个控制终端,则脱离这个控制终端。
必须在第二次fork之前显式忽略SIGHUP信号。孙子进程将继承子进程所设置的信号句柄。
疑问:如果不忽略SIGHUP,第二次fork后,子进程退出,是否会向孙子进程发送SIGHUP信号?如果发送,是否紧接着会发送SIGCONT?不然的话孙子进程不就挂起了?
非作业控制型shell对&的解释一般只是fork,没有setpgid,这样启动的进程与shell属于同一进程组。
后面讨论都假设是用支持作业控制的shell。
在控制终端按下ctrl-c,终端驱动程序产生SIGINT信号并分发至前台进程组所有进程。
APUE提到,当session leader终止时,系统会向该session前台进程组中所有进程分发SIGHUP信号,按照惯例意味着“终端线路被挂断”,与父进程无关。在以下两种情况下SIGHUP会在一个进程死时发送:
1. 当一个终端设备与一个会话相关联,而这个会话的leader死时,SIGHUP会被发送至这个终端设备的所有前台进程组。
2. 当一个进程死去导致一个进程组变成孤儿,而且该进程组里一个或多个进程处于“暂停”状态时,SIGHUP和SIGCONT被发送至这个孤儿进程组的所有成员进程。
如果某进程组中有一个进程,其父进程属于同一session的另一个进程组,则该进程组不是“孤儿进程组”,反之该进程组称为“孤儿进程组”。
setsid()如果成功,产生3个结果:
1. 创建一个新的session,当前进程成为session leader,也是新的session中的唯一进程。
2. 当前进程成为一个新进程组的组长。这个进程组何时创建?
3. 如果当前进程以前有一个控制终端,则脱离这个控制终端。
必须在第二次fork之前显式忽略SIGHUP信号。孙子进程将继承子进程所设置的信号句柄。
疑问:如果不忽略SIGHUP,第二次fork后,子进程退出,是否会向孙子进程发送SIGHUP信号?如果发送,是否紧接着会发送SIGCONT?不然的话孙子进程不就挂起了?
相关阅读 更多 +