Linux系統程式設計---程序終止
程序終止
程序的退出有三種場景:
- 程式碼執行完畢,結果正確
- 程式碼執行完畢,結果不正確
- 程式碼異常終止
程序退出方法
-
從main返回
-
呼叫exit函式
-
呼叫_exit函式
-
ctrl + c :x訊號終止
其中前三種為正常退出,而第四種是異常退出。在終端可以使用命令 “echo $? ”檢視程序退出碼
接下來我們來看程序推出的函式有哪些
_exit函式
#include <unistd.h>
void _exit(int status);//status定義了程序的終止狀態,父程序通過wait來獲取該值
功能: 函式_exit()“立即”終止呼叫程序。 任何屬於該程序打的開檔案描述符都將被關閉; 該程序的任何子程序都由程序1,init繼承,並且給該程序的父程序傳送SIGCHLD訊號。
注意的是:雖然status是int,但是隻有低8位才被夫程序使用,所以當exit(-1)時,在終端執行$?會發現結果是
255。
exit函式
#include <stdlib.h>
void exit(int value);
exit最後也會呼叫_exit函式,但在呼叫_exit函式之前,還做了其他工作:
- 執行使用者通過aexit或on_exit定義的清理函式。
- 關閉所有開啟的流,所有的快取資料均被寫入。
- 呼叫_exit函式
我們舉個例子:
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello");
_exit(0);
}
#include<stdio.h>
//#include<stdlib.h>
int main()
{
printf("hello");
exit(0);
}
對比兩個函式,我們可以看出_函式在執行時,什麼都沒做,就直接退出程序;而exit()函式則是做了一系列的工作之後,才呼叫_exit函式退出程序。
return 退出
return 的作用只是結束呼叫 return 的所在函式,只要這個函式不是主函式( main() ),只要主函式沒有結束,return 並不能結束程序。
對於在主函式中的(main()),執行return等同於執行exit((n),因為呼叫main的執行函式時會將main的返回值當作exit的引數。
舉個例子:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void func()
{
sleep(3);
printf("hello\n");
return ;
//exit(0);
}
int main()
{
func();
printf("main:hello\n");
while(1);
return 0;
}
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void func()
{
sleep(3);
printf("hello\n");
//return ;
exit(0);
}
int main()
{
func();
printf("main:hello\n");
while(1);
return 0;
}
我們看到結果:func函式呼叫return之後,程序並不會退出;而呼叫exit函式之後程序就直接做完該做的工作之後,就直接退出了,後面主函式的語句也不會執行。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void func()
{
printf("hello\n");
return ;
//exit(0);
}
int main()
{
printf("main:hello\n");
return 0;
func();
}
而在主函式中,執行return,程序就直接退出程序。
總結就是:
return: 只有在main中執行才會退出程序,在main中return跟呼叫exit效果一樣。
exit(): 退出時會逐步釋放所有資源。重新整理緩衝區,關閉流,關閉檔案,做很多操作 在程序的任意位置呼叫exit都會退出程序。
_exit(): 粗暴的退出程序,什麼都不做直釋放資源。
退出碼:
perror,strerror用於列印退出碼