- 论坛徽章:
- 0
|
《UNIX环境高级编程》第十章说:“如果对话期首进程(session leader)终止,则也产生SIGHUP。此信号被发送给该对话期前台进程组中的每一个进程。”
《UNIX网络编程》第一卷指出:把一个进程精灵化的过程是,先fork,父进程退出;之后在子进程中调用setsid创建一个新的对话期;第三步是“忽略SIGHUP信号并再次fork”。问题在于书上对第三步的解释是:“再次fork前,我们必须忽略SIGHUP,因为对话期首进程(也就是第一个子进程)结束时,该对话期中的全部进程都将收到SIGHUP信号。”
问题:对话期首进程结束时,到底是哪些进程会收到SIGHUP?是该对话期中的全部进程,还是该对话期前台进程组中的全部进程?
我在Solaris 5.8,g++ 3.3.2测试得到的结果是,
- void
- handle_hup(int signo) {
- char info2[100];
- snprintf(info2, 100, "Process %d received SIGHUP.\n", getpid());
- write(STDOUT_FILENO, info2, strlen(info2));
- return;
- }
- int
- daemonize() {
- // step 1: fork() and let the parent terminate.
- pid_t pid = 0;
- if ((pid = fork()) >; 0) { // the parent
- _exit(0);
- }
- // step 2: setsid() to create a new session.
- setsid();
- // step 3: catch SIGHUP and fork() again
- struct sigaction newact, oact;
- newact.sa_handler = handle_hup;
- sigemptyset(&newact.sa_mask);
- sigaction(SIGHUP, &newact, &oact);
- if ((pid = fork()) >; 0) { // the 1st child, a session leader
- pause();
- _exit(0);
- }
- if ((pid = fork()) >; 0) { // the 2nd child
- pause();
- _exit(0);
- }
- // the 3rd child. Make a new process group in the same session.
- setpgid(0, 0);
- if ((pid = fork()) >; 0) { // the 3rd child, a process group leader
- pause();
- _exit(0);
- }
- // the 4th child
- pause();
- return 0;
- }
- int
- main() {
- daemonize();
- return 0;
- }
- $ a.out
- $ ps -ejl | grep a.out
- 8 S 203327 4486 4485 4485 4485 0 51 20 ? 219 ? ?
- 0:00 a.out
- 8 S 203327 4488 4487 4487 4485 0 41 20 ? 219 ? ?
- 0:00 a.out
- 8 S 203327 4487 4486 4487 4485 0 51 20 ? 219 ? ?
- 0:00 a.out
- 8 S 203327 4485 1 4485 4485 0 51 20 ? 219 ? ?
- 0:00 a.out
- $ kill -INT 4485
- $ r ps
- ps -ejl | grep a.out
- 8 S 203327 4486 1 4485 4485 0 51 20 ? 219 ? ?
- 0:00 a.out
- 8 S 203327 4488 4487 4487 4485 0 41 20 ? 219 ? ?
- 0:00 a.out
- 8 S 203327 4487 4486 4487 4485 0 51 20 ? 219 ? ?
- 0:00 a.out
- $
复制代码
运行结果证明该对话期的两个进程组中,剩下的全部三个进程,在对话期首进程被终止的时候,都没有收到SIGHUP信号。为了证明我们的SIGHUP handler是有效的,我们继续:
- $ kill -HUP 4487
- Process 4487 received SIGHUP.
- $ r ps
- ps -ejl | grep a.out
- 8 S 203327 4486 1 4485 4485 0 51 20 ? 219 ? ?
- 0:00 a.out
- 8 S 203327 4488 1 4487 4485 0 41 20 ? 219 ? ?
- 0:00 a.out
- $
复制代码
求教高人,问题到底出在哪里?SIGHUP到底什么时候被发送,给哪些进程? |
|