读书人

APUE中关于controlling terminal的1点

发布时间: 2013-01-19 11:41:36 作者: rapoo

APUE中关于controlling terminal的一点疑问

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菜鸟,各位大神,求指点。
[解决办法]
引用:
C/C++ code?12345678910111213141516171819202122232425262728293031323334353637static voidsig_hup(int signo){ printf("SIGHUP received, pid = %d\n", getpid());} static voidpr_ids(char ……



父进程比子进程先结束,子进程成为被init领养成为孤儿进程,此时子进程已经是在后台进程组了

后台进程组的进程本来就是可以写终端而还能读取终端的,当然,可以都过stty tostop命令阻止后台进程组往终端写.

你可以先使用stty tostop再执行你的程序,那子进程stop返回后就不能输出到终端了

读书人网 >UNIXLINUX

热点推荐