关于控制终端,会话的疑问
暴风lay 2011-11-16 04:29:34 #include<stdio.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
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()
{
char c;
pid_t pid,pid1;
if((pid=fork())<0)
{
perror("fork error");
exit(1);
}
else if(pid>0)
{
pr_ids("parent");
exit(0);
}
else
{
pr_ids("child");
sleep(3);
//pid1=setsid();
//if(open("/dev/tty",O_RDWR)<0)
// printf("no controlling terminal\n");
//pr_ids("child");
if(read(STDIN_FILENO,&c,1)!=1)
printf("read error from controlling TTY,errno=%d\n",errno);
//printf("c=%c\n",c);
exit(0);
}
}
运行结果:说明后台进程想读取控制终端时,对后台进程产生SIGTTIN。因为是孤儿进程,所以read返回出错。
[root@localhost linux]# ./test9_2
child:pid=11854,ppid=11853,pgrp=11853,tpgrp=11853
parent:pid=11853,ppid=9156,pgrp=11853,tpgrp=11853
[root@localhost linux]# child:pid=11854,ppid=1,pgrp=11853,tpgrp=9156
read error from controlling TTY,errno=5
[root@localhost linux]#
去掉注释,使子进程创建一个会话。这运行结果说明创建会话后的进程没有控制终端。问题来了
1,没有控制终端和能读取输入的字符和输出到屏幕是什么关系?
2,没有控制终端了为什么还能read(STDIN_FILENO,&c,1)。
3,在第一种情况下说明后台进程不能read(STDIN_FILENO,&c,1),但第二种情况也是变成后台进程为什么可以了
[root@localhost linux]# ./test9_2
child:pid=12003,ppid=12002,pgrp=12002,tpgrp=12002
parent:pid=12002,ppid=9156,pgrp=12002,tpgrp=12002
[root@localhost linux]# no controlling terminal
child:pid=12003,ppid=1,pgrp=12003,tpgrp=-1
[root@localhost linux]# c=s /输入s
[root@localhost linux]#
疑问多了点,希望能为我讲解讲解,小弟先谢谢了