问题1——在子进程中调用execl完后,接着调用_exit(0)的意义——< APUE-P201>

整个程序是这样的:

if(pid == 0)

{

execl("/bin/sh", "sh", "-c", cmdtring, (char*0))

_exit(127);

}


首先,要搞清楚exec的执行是替换整个程序执行的。也就是将整个程序内容(包括数据、堆、栈空间,尤其是文本静态区),都会给替换掉的。

所以如果execl成功,那么后面的程序代码是不会再执行的。

所以_exit(127)是在execl调用不成功时执行的。

那么就来说说_exit(127)好了,首先返回值127的意思是,命令cmd不存在,当execl执行失败时,多为命令不存在或是权限的问题,所以当exec执行失败而接下去执行子进程时,子进程就告诉父进程失败原因,所以返回127。而_exit()和exit()最主要的区别就是前者不会将标准缓冲区进行冲洗就终止进程并向内核返回括号内的返回值。

在P201中说道,调用_exit而不调用exit的主要原因是为了防止任一标准缓冲区(这些缓冲区会在fork中由父进程复制到子进程)在子进程中被冲洗。可是据我所知,缓冲区复制意味着这是两个不同的缓冲区,且分别存在不同的进程(父、子进程)空间中,那么既然是在不同的进程空间中,那么fork之后的这两个缓冲区应该是没有关系、互相独立的才对啊(如果非要说有点什么关系的话,那顶多就是在刚fork完后两个缓冲区里存放的内容是一样的,也就是说如果在fork前调用printf("不带\n的字符串"),那么fork后的起初会在两个缓冲区中都会有存放这个字符串的内容,那么在fork后如果父、子进程都分别调用了fflush的话,那么父子进程都会输出两个一模一样的字符串出来)。好,回到刚才开始的“调用_exite而不调用exit 是为了 防止任一标准缓冲区在子进程中被冲洗”。它这"任一缓冲区"是啥意思啊?如果是父进程的缓冲区,那么exit要终止的也是子进程,要冲洗的也是子进程的缓冲区,关父进程的缓冲区什么事啊!可如果是指的是子进程的缓冲区,那么子进程都要结束,那么缓冲区冲洗就冲洗了呗,反正在这里也没什么大碍,因为那么这里即没有printf, 也没有打开文件(注意说明下,一个进程里面不只有一个缓冲区的,进程里每一个打开文件都有一个缓冲区),那么也就意味着它没有什么缓冲区是怕被冲洗的,如果是fork前从父进程那继承来的stdin缓冲区的内容,那——对哦,它指的不会是这个吧,复制来的缓冲区的内容?------不会吧!是不是也太窄了?  

那么,这样的话就又回来了,那句任一缓冲区到底啥意思嘛?是我想多了,它指的就是刚才最后的猜想那样,还是有些点我还没我还学不到位啊,亦或者是翻译,还是书写着本人的口误?亦或是我自己想多了????—— 求指教。T_T。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值