- 論壇徽章:
- 11
|
本帖最后由 zylthinking 于 2016-04-08 18:50 編輯
fmjz_qs214 發(fā)表于 2016-04-08 16:24 ![]()
我在我的centos6.5系統(tǒng)中運(yùn)行《UNIX環(huán)境高級(jí)編程》書中一個(gè)程序?yàn)楹谓Y(jié)果跟書上說(shuō)的不一樣?#include "apue. ...
這個(gè)和 vfork 無(wú)關(guān), 和 stdout 及 exit 有關(guān);
vfork 會(huì)對(duì) CLONE_FILES, 因此, 子進(jìn)程擁有自己的 fd, 但又沒(méi)有復(fù)制內(nèi)存, 因此共用父進(jìn)程的 stdout;
子進(jìn)程 exit 是會(huì)關(guān)掉 stdout, 但 stdout 指向的 fd 確實(shí)子進(jìn)程自己的, 關(guān)不掉父進(jìn)程的;
APUE 這么說(shuō), 有一定道理在于它說(shuō)的并不單單是 linux, 就算是 linux, 也未必是一個(gè) glibc;
父進(jìn)程引用 stdout 就可能會(huì)崩潰, 也可能寫不去, 也可能就是似乎一切正常;這個(gè)要看 exit 會(huì)將 stdout 指向的內(nèi)存破壞到什么程度。
如果最單純的, 什么事也沒(méi)做, 只是關(guān)閉了 fd, 或者 free 掉 stdout, 但沒(méi)有對(duì)該內(nèi)存中的內(nèi)容做任何寫, 那么其實(shí)和沒(méi) free 沒(méi)什么區(qū)別, 那么父進(jìn)程 printf 是可以成功的, 因?yàn)殛P(guān)鍵的 fd 其實(shí)是父進(jìn)程自己私有的
|
|