程序等待與退出
* 程序等待就是等待子程序的狀態改變,獲取子程序的退出狀態碼, 允許系統釋放子程序的所有資源,這時候子程序在所有資源才會被釋放掉。
* 程序等待是避免產生殭屍程序的主要方式
程序等待的方式:
1. pid_t wait(int *status)
status 用於獲取子程序 退出狀態碼
返回值是返回退出的子程序pid
wait 函式目的就是為了等待任意一個子程序的退出
因為wait是一個阻塞型的函式,因此如果沒有子程序退出
那麼他就一直等待,直到有子程序退出
2. pid_t waitpid(pid_t pid, int *status, int options);
pid: -1:等待任意子程序 >0 等待指定的子程序
status: 獲取退出狀態碼
options:0:阻塞 WNOHANG:非阻塞
返回值:-1:出錯 ==0:沒有子程序退出 >0:退出的子程序pid
waitpid是一個阻塞/非阻塞可選的函式
具體程式碼實現:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> int main() { pid_t pid = fork(); if (pid < 0) { exit(-1); }else if (pid == 0) { sleep(3); exit(99); } pid_t id = -1; if ((id = wait(NULL)) < 0) { perror("wait error"); } int status = -1; while((id = waitpid(pid, &status, WNOHANG)) == 0) { //可以看一看c與指標 //回過頭再判斷一下有沒有子程序退出 } if ((status & 0x7f) == 0) { printf("child exit status:[%d]\n", (status >> 8)&0xff); } if (WIFEXITED(status)) { printf("child exit status:[%d]\n", WEXITSTATUS(status)); } while(1) { sleep(1); } printf("child :%d eixt %d\n", id, pid); return 0; }
程序退出:
其中主要退出形式有:1.程式碼執行完畢退出 A 結果正確 B結果不正確
2.程式碼異常退出
正常中止:1. main函式中return
2. exit(int status)庫函式呼叫在程式任意位置呼叫都會使程序退出
status是程序的退出狀態
3. _exit(int status)系統呼叫介面在程式任意位置呼叫都會使程序退出
exit最終呼叫的就是這個介面退出的
exit與_exit的區別
* exit是溫和性的退出,在退出前會溫和的釋放資源,重新整理緩衝區
* _exit是暴力退出,直接釋放資源退出,不會重新整理緩衝區
具體demo如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int errno;
int main()
{
int i;
for (i = 0; i < 255; i++) {
printf("%s\n", strerror(i));
}
printf("%s\n", strerror(errno));
perror("fdgfhgj");
printf("hello world");
//exit(0);
_exit(0);
sleep(3);
return 0;
}