waitpid
首先我們來了解一下所謂的僵尸進程,
僵尸進程就是兩個進程,一個父進程,一個子進程,其子進程終止后,0-3G的用戶內存被回收,而3-4G的部分內存被回收,但是3-4G內存中的PCB等待父進程回收,若PCB未被父進程回收,我們稱這個進程為僵尸進程,
python empty函數,注,之所以保留PCB,是因為其中保存著子進程的終止狀態
父進程回收子進程的資源所用到的函數就是我們今天所要說的wait()和waitpid()函數
那么我們先來了解一下wait函數
wait是一個阻塞函數,如果沒有可以回收的子進程,則為阻塞狀態
linux sleep函數、如果無子進程,則返回-1
如果回收成功,則返回子進程的pid
返回值pid_t
wait()? 只有一個參數 可以為NULL,也可以為int* status
wait和waitpid?所需要的頭文件
#include
#include
而waitpid()是對wait()函數的優化,我們在父進程使用wait()函數時,因為這個函數是處于阻塞狀態的,使父進程不能處理其他事情,這樣便浪費了父進程的資源,所以我們引出了waitpid()
wait()函數?waitpid()非阻塞 函數有三個參數
參數1:
-1 時 回收任意的相關進程
0 時,回收調用者組中的子進程
waitcomevent函數作用,>0時,回收一個指定進程
參數2:可為NULL也可為int* status 為子進程的終止情況(退出碼)
參數3:WNOHANG 為非阻塞狀態
返回值? -1:失敗或者沒有回收子進程返回-1
fork()函數,>0: 返回回收的子進程ID
0:代表子進程未結束,非阻塞輪詢返回
注:參數2為傳出參數 使用宏函數 WIFEXITED(status)
WEXITSTATUS(status)
wait函數用法?WIFsignalED(status)
WTERMSIG(status)
前兩個宏函數為一組 ,后兩個宏函數為一組,前兩個是正常退出,后兩個代表信號退出
下面我們來看一下代碼:#include
#include
#include
#include
#include
#include
int main(void)
{
pid_t pid,wpid;
int status,i;//子進程的終止
for(i=0;i<10;i++){
pid = fork();
if(pid == 0)
break;
}
if(pid > 0){
printf("parent pid=%d\n",getpid());
//wait阻塞函數,如果沒有可回收子進程阻塞,如果沒有子進程返回-1,如果回收成功返回子進程pid
//waipid return value:-1,>0,0
//-1:沒有可回收子進程
//>0:返回回收子進程pid
//0:代表子進程未結束,非阻塞輪詢返回
while((wpid = waitpid(-1,&status,WNOHANG))!=-1){
if(wpid > 0)
{
if(WIFEXITED(status))
printf("parent wait child pid:%d\texit code:%d\n",wpid,WEXITSTATUS(status));
if(WIFSIGNALED(status))
printf("parent wait child pid:%d\tsignal No:%d\n",wpid,WTERMSIG(status));
}
}
}else if(pid == 0){
printf("child id=%d\tpid=%d\n",i,getpid());
if(i<9){
sleep(i);
exit(i);
}
while(1);
}else{
pERROR("Fork Call failed:");
exit(0);
}
return 0;
}
相關閱讀
本文參考了:How the heck does async/await work in Python 3.5?
PEP 380: Syntax for Delegating to a Subgenerator
yield 和 yi
背景是我的php總有慢日志,但是dba那邊沒有慢查詢日志。php-fpm.conf里設置的超時時間是1s,slb那邊的超時時間是3s。
有如下幾種情況
清除陷入CLOSE_WAIT的進程,而不清除父進程的方法,理論上來說是可行的,但是有可能引起相關組件不能正確顯示狀態數據。比如,使用Apache
有時需要在程序中調用可執行程序或腳本命令:
Process process = Runtime.getRuntime().exec(shPath);
int exitCode = process?.w
#include #include #include #include #include #include in
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态