- 论坛徽章:
- 11
|
本帖最后由 zylthinking 于 2016-04-08 18:50 编辑
fmjz_qs214 发表于 2016-04-08 16:24 ![]()
我在我的centos6.5系统中运行《UNIX环境高级编程》书中一个程序为何结果跟书上说的不一样?#include "apue. ...
这个和 vfork 无关, 和 stdout 及 exit 有关;
vfork 会对 CLONE_FILES, 因此, 子进程拥有自己的 fd, 但又没有复制内存, 因此共用父进程的 stdout;
子进程 exit 是会关掉 stdout, 但 stdout 指向的 fd 确实子进程自己的, 关不掉父进程的;
APUE 这么说, 有一定道理在于它说的并不单单是 linux, 就算是 linux, 也未必是一个 glibc;
父进程引用 stdout 就可能会崩溃, 也可能写不去, 也可能就是似乎一切正常;这个要看 exit 会将 stdout 指向的内存破坏到什么程度。
如果最单纯的, 什么事也没做, 只是关闭了 fd, 或者 free 掉 stdout, 但没有对该内存中的内容做任何写, 那么其实和没 free 没什么区别, 那么父进程 printf 是可以成功的, 因为关键的 fd 其实是父进程自己私有的
|
|