Linux程序控制--程序退出和等待
阿新 • • 發佈:2018-12-19
Linux程序退出
1. 程序退出的場景
- 程式碼執行完畢正常退出,結果正確
- 程式碼執行完畢正常退出,結果不正確
- 異常退出
2 .程序常見退出方式
- 正常退出 從main() 函式中返回return退出 呼叫exit()函式退出 呼叫_exit()函式退出
- 異常退出 由訊號終止
return return是常見的程序退出方式,執行return等同於執行exit函式,main()函式中return n函式返回值作為exit(n)函式的引數 exit() exit()是c庫函式其執行流程 首先呼叫使用者定義的清理函式ateixt或者on_exit,清理標準輸出快取去(將輸出快取區內容寫入檔案),關閉所有開啟的檔案流等,然後回撥用_eixt()函式。 需要注意的是由fork()函式建立的子程序分支裡,正常情況下使用函式exit()是不正確的,這是因為使用它會導致標準輸入輸出的緩衝區被清空兩次,而且臨時檔案可能被意外刪除 另外需要注意的是呼叫exit() 函式會結束掉整個程序組中的所有程序(執行緒) _exit()
Linux程序等待
建立子程序後如果父程序不等待,子程序退出後會成為殭屍程序,直到父程序來獲取退出資訊後才會釋放剩餘資源,並且此時該程序無法被訊號殺死,繼續佔用資源造成記憶體洩露。 程序等待方式: wait() 函式原形:pid_t wait(int * status); 返回值:退出的子程序的pid,失敗返回-1 引數:輸出型引數,用於獲取子程序退出狀態碼,不關心可以置為NULL 是一個阻塞式等待,必須等到有一個子程序退出後獲取退出狀態,釋放資源才可以返回 waitpid()
1 #include <unistd.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <string.h>
5 #include <stdio.h>
6
7 int main()
8 {
9 pid_t pid = fork();
10 if(pid < 0)
11 {
12 perror("creat child error");
13 }
14 else if(pid == 0)
15 {
16 printf("this is child:%d\n", getpid());
17 sleep(10);
18 _exit(10);
19 }else if(pid > 0)
20 {
21 printf("this is parent:%d\n", getpid());
22 int sta = 0;
23 int ret = wait(&sta);
24 if(ret > 0 && (sta & 0xFF) == 0)//後8位為0時正常退出
25 {
26 printf("child exit code:%d\n", (sta >> 8)&0xFF);
27 }else if(ret > 0)//異常退出
28 {
29 printf("sig code:%d\n", sta & 0x7F);
30 }
31 }
32 return 0;
33 }