C/C++ 中 exit() 函數


參考: https://blog.csdn.net/jjjcainiao/article/details/21935795

 

知乎上的問題】C/C++ 中 exit() 函數的參數到底有什么意義?

C 語言的設計之初就是為  Unix 系統設計的,而這個系統是『很多程序互相配合』搭配成一個系統。每個運行着的程序都是進程,而進程就會有父進程,父進程通常是直接啟動你的進程,父進程死亡的進程會被 init 收養,其父進程變為 init,而 init 的父進程是進程 0,進程 0 則是系統啟動時啟動的第一個進程。exit() 里面的參數,是傳遞給其父進程的。對父進程來說,你的進程仿佛是一個函數,而函數可以有返回值。所以回答第一個問題:exit() 的參數,是給自己的父進程使用的。通常一個程序的父進程可能是任何進程,因此我們無法預期我們的父進程是否規定必須要有這個返回值,那么我們應當提供這個返回值,以保證不同的父進程的需求得到滿足。一個典型的例子是 make,Makefile 對於一個 target 下面有多條順序執行的語句,而 make 作為父進程,會檢查每個語句的返回值是否為 0 ,遇到任何一個非 0 值,都會停止當前 rule 的執行。而我們知道,make 實際上可以執行任何命令任何程序,因而任何被 make  調用的程序必須有正確的返回值。另外一個問題,為什么要使用 exit() 函數?答:是歷史原因,雖然現在大多數平台下,直接在 main() 函數里面 return 可以退出程序。但是在某些平台下,在 main() 函數里面 return 會導致程序永遠不退出(因為代碼已經執行完畢,程序卻還沒有收到要退出的指令)。換句話說,為了兼容性考慮,在特定的平台下,程序最后一行必須使用  exit() 才能正常退出,這是 exit() 存在的重要價值。

【轉自specialping】

C語言中Exit函數的使用 exit() 結束當前進程/當前程序/,在整個程序中,只要調用 exit ,就結束 return()  是當前函數返回,當然如果是在主函數main, 自然也就結束當前進程了,如果不是,那就是退回上一層調用。在多個進程時.如果有時要檢測上進程是否正常退出的.就要用到上個進程的返回值.. exit(1)表示進程正常退出.  返回 1;exit(0)表示進程非正常退出.  返回 0.進程環境與進程控制(1):  進程的開始與終止 1.  進程的開始:C程序是從main函數開始執行,  原型如下:int  main(int argc, char *argv[]);通常main的返回值是int型,  正確返回0. 如果main的返回值為void或者無,  某些編譯器會給出警告, 此時main的返回值通常是0.關於main的命令行參數不做過多解釋,  以下面的程序展示一下:#i  nclude <stdio.h>int  main(int argc, char *argv[]){int  i;for  (i = 0; i < argc; i++)printf("argv[%d]:  %s\n", i, argv[i]);return  0;}2.  進程終止:C程序的終止分為兩種:  正常終止和異常終止.正常終止分為:  return, exit, _exit, _Exit, pthreade_exit異常中指分為:  abort, SIGNAL, 線程響應取消主要說一下正常終止的前4種,  即exit系列函數.#i  nclude <stdlib.h> /* ISO C */void  exit(int status);void  _Exit(int status);#i  nclude <unistd.h> /* POSIX */void  _exit(int status);以上3個函數的區別是:exit()(或return  0)會調用終止處理程序和用戶空間的標准I/O清理程序(如fclose), _exit和_Exit不調用而直接由內核接管進行清理.因此,  在main函數中exit(0)等價於return 0.3.  atexit終止處理程序:ISO  C規定, 一個進程最對可登記32個終止處理函數, 這些函數由exit按登記相反的順序自動調用. 如果同一函數登記多次, 也會被調用多次.原型如下:#i  nclude <stdlib.h>int  atexit(void (*func)(void));其中參數是一個函數指針,  指向終止處理函數, 該函數無參無返回值.以下面的程序為例:

#i  nclude <stdlib.h>static  void myexit1(){printf("first  exit handler\n");}static  void myexit2(){printf("second  exit handler\n");}int  main(){if  (atexit(my_exit2) != 0)printf("can't  register my_exit2\n");if  (atexit(my_exit1) != 0)printf("can't  register my_exit1\n");if  (atexit(my_exit1) != 0)printf("can't  register my_exit1\n");printf("main  is done\n");return  0;}運行結果:$  ./a.outmain  is donefirst  exit handlerfirst  exit handlersecond  exit handler運行結果:$./a.out  arg1 arg2 arg3argv[0]:  ./a.outargv[1]:  arg1argv[2]:  arg2argv[3]:  arg3 ———————————————— 版權聲明:本文為CSDN博主「傑Tang_fighting」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/jjjcainiao/article/details/21935795


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM