Chinaunix

标题: 守护进程中关于printf的一点疑问 [打印本页]

作者: empty141    时间: 2010-05-26 11:39
标题: 守护进程中关于printf的一点疑问
本帖最后由 empty141 于 2010-05-26 12:09 编辑

一般创建一个守护进程会经过以下几步:
1、fork()生成子进程;
2、父进程退出;
3、子进程调用setsid()创建新会话;
4、chdir()更改工作目录;
5、关闭已打开的文件描述符
第3步子进程调用setsid()后会与控制终端分离,此时如果第5步中
不显式关闭已打开的文件描述符(从父进程继承来的,比如标准输出)
子进程仍然可以printf到终端
这里setsid()分离的“控制终端”与printf的“终端”是什么关系
作者: rain_fish    时间: 2010-05-26 11:41
子进程复制了文件描述符,如果不关闭,不应该输出到终端吗?
作者: Kabie    时间: 2010-05-26 11:43
…………标准输出还不是同一个。。。

哪里不能理解。。。
作者: empty141    时间: 2010-05-26 12:09
可能是我没表述明白,我的意思是setsid()使得子进程与控制终端分离,但是仍然可以在终端看到子进程的输出,所以问题是这里setsid()分离的“控制终端”与printf的“终端”是什么关系
作者: pagx    时间: 2010-05-26 13:13
控制终端是用来进行作业控制的。没有控制终端的进程,是无法使用 CTRL+Z CTRL+Q CTRL+C 这些,通过终端发送的信号的。只能使用kill来发送信号。只有printf使用的标准输出,跟控制终端是两回事。
运行 sleep 100 < /dev/zero > /dev/null 这个命令时, 虽然标准输入输出已经重定向,但是依然可以通过控制终端的CTRL+Q来终止运行。
还是自己去复习一下Unix的基本知识吧。
作者: empty141    时间: 2010-05-27 08:30
谢谢LS ,貌似有点明白了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2