发布网友 发布时间:2022-04-24 10:43
共1个回答
热心网友 时间:2023-10-10 11:11
首先控制终端 controlling terminal 是指/dev/tty,你man 4 tty 第一排字就这样写着。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。
其次,第一个fork 后有一步比较关键就是setsid。
你man一下 setsid可以知道,
1进程组首进程不能调用setsid,会得到EPERM错误,这就是第一个fork的原因,执行第一个fork并让父进程退出,子进程继续,这时候由于子进程会继承其父进程的进程组GID并有自己的进程PID,而这个PID和GID肯定是不一样的。所子进程绝不可能成为进程组首进程,满足了调用setsid的条件。
2调用setsid后所有到之前控制终端的连接都会断开。
最后,再执行一次fork,让子进程退出,孙进程继续。这样让孙进程pid不等于它所在的会话sid,这样它就不会自己变成会话首进程,也就使它不能打开控制终端。这样守护进程就得到了一个干净的环境,它不会被终端产生的信号干扰。追问我还是不明白所谓的打开终端,那进程是怎样打开控制终端的,我以为的控制终端是shell程序
追答open("/dev/tty", O_RDWR); 这样就是打开控制终端
命令行程序的stdin 和stdout都定向到了 /dev/tty(这句话有失偏颇,应该说,
stdin = open("/dev/tty", O_RDONLY);
stdout = open("/dev/tty", O_WRONLY);
你可以开个shell,然后cat /dev/tty 自己试试