耗资喜欢猫 发表于 2012-12-22 17:40

APUE第九章示例代码的问题

在APUE第九章的示例程序的解释中说到,“最后,要注意的是父进程终止时,子进程被置入后台进程组中,因为父进程是由shell作为前台作业执行的”。但我用debian7 run这个示例程序的时候,却并不像书上所说的那样,Ok,有图有真相http://blog.chinaunix.net/attachment/201212/22/27642956_1356168728S1Ke.png
在上图中,我们看到,父进程结束时,子进程并没有被置入后台进程组中,而仍然是保留在前台进程组中,这是为什么?

为了节省大家的时间,我把书中源代码贴上来#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);
        }
}

linux_c_py_php 发表于 2012-12-23 15:03

意思是说shell这个程序是那么做的, 不是说系统会把任何父进程和子进程这样处理.

耗资喜欢猫 发表于 2012-12-23 15:18

linux_c_py_php 发表于 2012-12-23 15:03 static/image/common/back.gif
意思是说shell这个程序是那么做的, 不是说系统会把任何父进程和子进程这样处理.

这种再象,只能在debian上观察到,我在ubuntu上,观察不到这种现象,而在debian上才能观察到这种现象,又作何解释?

耗资喜欢猫 发表于 2012-12-24 20:40

难道用debian的坛友没遇到这个问题,我分别在debian6跟debian7上run过这个示例程序,结果跟1楼的图一样,但是用ubuntu则不会出现这种情况,难道这是debian的特色?
页: [1]
查看完整版本: APUE第九章示例代码的问题