leewon1988 发表于 2013-01-10 14:33

APUE书中的一点疑问--关于controlling terminal

本帖最后由 leewon1988 于 2013-01-10 14:43 编辑

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) {
                printf("fork error");
      }
      else if (pid > 0) {   
                sleep(5);            
                exit(0);               
      }
      else {                  
                pr_ids("child");
                signal(SIGHUP, sig_hup);      
            kill(getpid(), SIGTSTP);      
                pr_ids("child");      //这里调用pr_ids时,父进程已经关闭,但是调用printf却可以向原来的controlling terminal写
                if (read(STDIN_FILENO, &c, 1) != 1)      //但是这里向原来的terminal读却有问题
                        printf("read error from controlling TTY, errno = %d\n",
                            errno);          //这里也可以向原来的controlling terminal写
                exit(0);
      }
}这是为什么?本人linux新手,可能是我理解有错误。
各位求指点

leewon1988 发表于 2013-01-10 14:58

我开始的理解是printf是继承于session leader的file no,但是STDIN_FILENO在变为孤儿进程组的时候是会被重置的。。
不用我是乱猜,而且完全没有根据。。。。


各位大牛,指点一二
页: [1]
查看完整版本: APUE书中的一点疑问--关于controlling terminal