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

暴风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]#

疑问多了点,希望能为我讲解讲解,小弟先谢谢了
...全文
95 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
暴风lay 2011-11-18
  • 打赏
  • 举报
回复
等大虾帮忙。。。
暴风lay 2011-11-17
  • 打赏
  • 举报
回复
别沉,大家看看,帮帮
暴风lay 2011-11-16
  • 打赏
  • 举报
回复
发现自己连控制终端也没弄明白是什么,tty。
百度了下tty,一堆的讲解也没看明白。。。救救我吧
justkk 2011-11-16
  • 打赏
  • 举报
回复
个人理解:
1、能否读取输入与是否前台运行有关,与是否有控制终端没有直接关系。后台运行的进程不能读取输入
2、控制终端是说,终端按键产生的信号(比如ctrl+c)可以送给相关的进程。没有控制终端的进程不会收到终端按键产生的信号
3、进程可以向屏幕输出,但那个终端不一定就是进程的控制终端。如果有权限,他可以打开任何一个终端设备,并输出信息

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧