暴风lay 发表于 2011-11-18 18:13

关于控制终端,会话的疑问

#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返回出错。
# ./test9_2
child:pid=11854,ppid=11853,pgrp=11853,tpgrp=11853
parent:pid=11853,ppid=9156,pgrp=11853,tpgrp=11853
# child:pid=11854,ppid=1,pgrp=11853,tpgrp=9156
read error from controlling TTY,errno=5

#

去掉注释,使子进程创建一个会话。这运行结果说明创建会话后的进程没有控制终端。问题来了

1,没有控制终端和能读取输入的字符和输出到屏幕是什么关系?
2,没有控制终端了为什么还能read(STDIN_FILENO,&c,1)。
3,在第一种情况下说明后台进程不能read(STDIN_FILENO,&c,1),但第二种情况也是变成后台进程为什么可以了

# ./test9_2
child:pid=12003,ppid=12002,pgrp=12002,tpgrp=12002
parent:pid=12002,ppid=9156,pgrp=12002,tpgrp=12002
# no controlling terminal
child:pid=12003,ppid=1,pgrp=12003,tpgrp=-1

# c=s /输入s

#

疑问多了点,希望能为我讲解讲解,小弟先谢谢了

暴风lay 发表于 2011-11-19 00:00

:mrgreen:

暴风lay 发表于 2011-11-19 09:09

等大虾。。。

mightofcode 发表于 2012-12-25 00:07

我的理解是同一会话内只能有一个前台进程组能读取输入
不同会话可以分别处理控制终端
调用setsid之后进程成为新会话的首进程,同时也是新进程组的组长
但是什么时候分配控制终端呢?
根据apue“如何分配控制终端的机制由具体实现选择”,我觉得第二个会话此时已经有了一个控制终端,那就是“/dev/tty”
所以能够进行输入

请大侠指正
页: [1]
查看完整版本: 关于控制终端,会话的疑问