程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux下C編程:關於進程等待

Linux下C編程:關於進程等待

編輯:關於C語言
#include <sys/types.h>      
#include <stdio.h>      
#include <sys/wait.h>      
           
void check_exit(int status);      
           
main()      
{      
    pid_t pid;      
    int status;      
    if((pid = fork()) < 0)      
    {      
    printf("fork error!!\n");      
    exit(0);      
    }      
    else if(pid == 0)      
    {      
    printf("child process exit\n");      
  
    exit(0);      
    }      
    else 
    {      
        if(wait(&status) != pid)      
        {      
        printf("wait error!!");      
        exit(0);      
        }      
        check_exit(status);      
    }      
           
}      
void check_exit(int status)      
{      
    if(WIFEXITED(status))      
        printf("eixt\n");      
               
    else if(WIFSIGNALED(status))      
        printf("killed by signal\n");      
    else if(WIFSTOPPED(status))      
        printf("stopped by signal\n");      
    else if(WIFCONTINUED(status))      
        printf("continued");      
}

等待進程改變其狀態。所有下面哪些調用都被用於等待子進程狀態的改 變,獲取狀態已改變的子進程信息。狀態改變可被認為是:1.子進程已終止。2.信號導致子進程停止執行。3.信號恢復子進程的執行。在子進程終止的情況 下,wait調用將允許系統釋放與子進程關聯的資源。如果不執行wait,終止了的子進程會停留在"zombie"狀態。

如果發現子進程改變了狀態,這些調用會立即返回。反之,調用會被阻塞直到子進程狀態改變,或者由信號處理句柄所中斷(假如系統調用沒有通過sigaction的SA_RESTART標志重啟動)。

wait 系統調用掛起當前執行中的進程,直到它的一個子進程終止。waitpid掛起當前進程的執行,直到指定的子進程狀態發生變化。默認,waitpid只等待 終止狀態的子進程,但這種行為可通過選項來改變。waitid系統調用對於等待哪個子進程狀態改變提供了更精確的控制。
 
子進程已終 止,父進程尚未對其執行wait操作,子進程會轉入“僵死”狀態。內核為“僵死”狀態的進程保留最少的信息量(進程標識,終止狀態,資源使用信息),過後 父進程執行wait時可以獲取子進程信息。只要僵死的進程不通過wait從系統中移去,它將會占據內核進程表中的一個欄位。如果進程表被填滿,內核將不能 再產生新進程。如果父進程已終止,它的僵死子進程將由init進程收養,並自動執行wait將它們移去。

wait(等待子進程中斷或結束)

#include<sys/types.h>      
           
#include<sys/wait.h>      
           
pid_t wait (int * status);

函數說明

;wait()會暫時停止目前進程的執行(掛起父進程),直到有信號來到或子進程結束。如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則參數 status 可以設成 NULL。如果調用wait的進程沒有子進程則會調用失敗,子進程的結束狀態值請參考 waitpid( )    

如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存於errno 中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved