整个程序是这样的:
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之后的这两个缓冲区应该是没有关系、互相独立的才对啊(如果非要说有点什么关系的话,那顶多