python empty函數,python waitpid_「waitpid」wait(),waitpid()函數 - seo實驗室

 2023-12-06 阅读 31 评论 0

摘要:waitpid首先我們來了解一下所謂的僵尸進程,僵尸進程就是兩個進程,一個父進程,一個子進程,其子進程終止后,0-3G的用戶內存被回收,而3-4G的部分內存被回收,但是3-4G內存中的PCB等待父進程回收,若PCB未被父進程回收

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/194358.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息