1. 程式人生 > >Linux系統程式設計---程序終止

Linux系統程式設計---程序終止

程序終止

程序的退出有三種場景:

  1. 程式碼執行完畢,結果正確
  2. 程式碼執行完畢,結果不正確
  3. 程式碼異常終止

程序退出方法

  1. 從main返回

  2. 呼叫exit函式

  3. 呼叫_exit函式

  4. 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函式之前,還做了其他工作:

  1. 執行使用者通過aexit或on_exit定義的清理函式。
  2. 關閉所有開啟的流,所有的快取資料均被寫入。
  3. 呼叫_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用於列印退出碼