perror ( )用 來 將 上 一 個 函 數 發 生 錯 誤 的 原 因 輸 出 到 標 準 錯誤 (stderr) 。參數 s 所指的字符串會先打印出,后面再加上錯誤原因字符串
exit 在C語言的main函數中我們通常使用return (0);這樣的方式返回一個值。但這是限定在非void情況下的,也就是非void main()這樣的形式。
exit()通常是用在子程序中用來終結程序用的,使用后程序自動結束。exit(0) 表示程序正常退出, exit(1)/exit(-1)表示程序異常退出。
(1)exit和return 的區別:
a.exit是一個函數,有參數。exit執行完后把控制權交給系統
b.return是函數執行完后的返回。renturn執行完后把控制權交給調用函數。
(2)exit和abort的區別:
a.exit是正常終止進程
b.about是異常終止。
3.exit和_exit函數都是用來終止進程的。
_exit()執行后立即返回給內核,而exit()要先執行一些清除操作,然后將控制權交給內核。調用_exit函數時,其會關閉進程所有的文件描述符,清理內存以及其他一些內核清理函數,但不會刷新流(stdin, stdout, stderr ...). exit函數是在_exit函數之上的一個封裝,其會調用_exit,并在調用之前先刷新流。
exit()函數與_exit()函數最大區別就在于exit()函數在調用exit系統之前要檢查文件的打開情況,把文件緩沖區的內容寫回文件。 由于linux的標準函數庫中,有一種被稱作“緩沖I/O”的操作,其特征就是對應每一個打開的文件,在內存中都有一片緩沖區。每次讀文件時,會連續的讀 出若干條記錄,這樣在下次讀文件時就可以直接從內存的緩沖區讀取;同樣,每次寫文件的時候也僅僅是寫入內存的緩沖區,等滿足了一定的條件(如達到了一定數 量或遇到特定字符等),再將緩沖區中的內容一次性寫入文件。這種技術大大增加了文件讀寫的速度,但也給編程代來了一點兒麻煩。比如有一些數據,認為已經寫 入了文件,實際上因為沒有滿足特定的條件,它們還只是保存在緩沖區內,這時用_exit()函數直接將進程關閉,緩沖區的數據就會丟失。因此,要想保證數 據的完整性,就一定要使用exit()函數。
在一個進程調用了 exit 之后,該進程并不馬上就完全消失,而是留下一個稱為 僵尸進程 (Zombie)的數據結構。僵尸進程是一種非常特殊的進程,它幾乎已經放棄了所有內存空間, 沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出 狀態等信息供其他進程收集,除此之外,僵尸進程不再占有任何內存空間.
wait waitpid wait 函數是用于使父進程(也就是調用 wait 的進程) 阻塞,直到一個子進程結束或者該進程接到了一個指定的信號為止。 如果該父進程沒有子進程或者他的子進程已經結束, wait則就會立即返回。
waitpid 的作用和 wait 一樣,但它并不一定要等待第一個終止的子進程,它還有若干選項,如可提供一個非阻塞版本的 wait 功能,也能支持作業控制。實際上 wait 函數只是 waitpid 函數的一個特例,在 Linux 內部實現 wait 函數時直接調用的就是 waitpid 函數。
新聞熱點
疑難解答