問題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。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章