当前位置: 技术问答>linux和unix
APUE中关于controlling terminal的一点疑问
来源: 互联网 发布时间:2017-03-29
本文导语: static void sig_hup(int signo) { printf("SIGHUP received, pid = %dn", getpid()); } static void pr_ids(char *name) { printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %dn", name, getpid(), getppid(), getpgrp(), tcge...
static void
sig_hup(int signo)
{
printf("SIGHUP received, pid = %dn", getpid());
}
static void
pr_ids(char *name)
{
printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %dn",
name, getpid(), getppid(), getpgrp(), tcgetpgrp(STDIN_FILENO));
fflush(stdout);
}
int
main(void)
{
char c;
pid_t pid;
pr_ids("parent");
if ((pid = fork()) 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 = %dn",
errno); //这里也可以向原来的controlling terminal写
exit(0);
}
}
本人linux菜鸟,各位大神,求指点。
|
父进程比子进程先结束,子进程成为被init领养成为孤儿进程,此时子进程已经是在后台进程组了
后台进程组的进程本来就是可以写终端而还能读取终端的,当然,可以都过stty tostop命令阻止后台进程组往终端写.
你可以先使用stty tostop再执行你的程序,那子进程stop返回后就不能输出到终端了