- 论坛徽章:
- 0
|
在APUE第九章的示例程序的解释中说到,“最后,要注意的是父进程终止时,子进程被置入后台进程组中,因为父进程是由shell作为前台作业执行的”。但我用debian7 run这个示例程序的时候,却并不像书上所说的那样,Ok,有图有真相
在上图中,我们看到,父进程结束时,子进程并没有被置入后台进程组中,而仍然是保留在前台进程组中,这是为什么?
为了节省大家的时间,我把书中源代码贴上来- #include "apue.h"
- #include <errno.h>
- static void
- sig_hup(int signo)
- {
- printf("SIGHUP received, pid = %d\n", getpid());
- }
- static void
- pr_ids(char *name)
- {
- printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d\n",
- name, getpid(), getppid(), getpgrp(), tcgetpgrp(STDIN_FILENO));
- fflush(stdout);
- }
- int
- main(void)
- {
- char c;
- pid_t pid;
- pr_ids("parent");
- if ((pid = fork()) < 0) {
- err_sys("fork error");
- } else if (pid > 0) { /* parent */
- sleep(5); /* sleep to let child stop itself */
- exit(0); /* then parent exits */
- } else { /* child */
- pr_ids("child");
- signal(SIGHUP, sig_hup); /* establish signal handler */
- kill(getpid(), SIGTSTP); /* stop ourself */
- pr_ids("child"); /* prints only if we're continued */
- if (read(STDIN_FILENO, &c, 1) != 1)
- printf("read error from controlling TTY, errno = %d\n",
- errno);
- exit(0);
- }
- }
复制代码 |
|