1. 程式人生 > >程序等待與退出

程序等待與退出

*      程序等待就是等待子程序的狀態改變,獲取子程序的退出狀態碼, 允許系統釋放子程序的所有資源,這時候子程序在所有資源才會被釋放掉。
 *      程序等待是避免產生殭屍程序的主要方式

        程序等待的方式:
 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;
}