python wait函數,python waitpid_waitpid使用的一點問題

 2023-12-06 阅读 34 评论 0

摘要:使用waipid的時候遇到了一個奇怪的問題,將情況簡化后描述一下。示例代碼如下所示。主進程會處理SIGCHLD信號,處理過程是等待子進程結束,如果子進程正常退出,打印捕獲到了SIGCHLD信號,否則打印錯誤碼。讓主進程后面sleep 3s是為了防止主進程

使用waipid的時候遇到了一個奇怪的問題,將情況簡化后描述一下。

示例代碼如下所示。主進程會處理SIGCHLD信號,處理過程是等待子進程結束,如果子進程正常退出,打印捕獲到了SIGCHLD信號,否則打印錯誤碼。讓主進程后面sleep 3s是為了防止主進程先于子進程退出,從而沒辦法響應子進程的退出信號。

測試正常fork的情況

注釋掉capture2和test system部分,使用capture1和test fork。

python wait函數。正常的情況輸出

this is parent.

this is child.

capture SIGCHLD1

視乎執行順序,前兩句有可能順序反過來,即先執行子進程,后執行主進程后面的部分

pycharm和python區別,測試system函數的情況

注釋掉capture2和test fork部分,使用capture1和test system部分。

輸出如下

a.out waitpid.c

SigChildFunc error! errno=10

waitpid函數返回值、可見這里waitpid出錯了,沒得到子進程的退出狀態,其中errno 10表示No child processes(errno定義見http://baike.baidu.com/view/3485007.htm),不過并不妨礙system正確執行命令。

原因在于system函數內部會經歷fork()->exec()->waitpid()三個階段,而我們的主函數中有處理SIGCHLD信號,里面還有waitpid操作。system本身的waitpid操作已經為子進程收尸過了,后面那個就會找不到子進程。處理的一種方式可以參見http://www.verydemo.com/demo_c167_i3191.html中的故事,我使用了另一種方式:即只waitpid我fork出的子進程,別的忽略掉,即waitpid的第一個參數不傳-1,而是child_pid。

測試連續兩次waitpid的情況

注釋掉test system,使用capture1、capture2和test fork部分。

輸出如下

python暫停和恢復?this is parent.

this is child.

capture SIGCHLD1

SigChildFunc error! errno=10

同樣得到了一次errno=10的錯誤。這說明不能連續嘗試2次waitpid。

python語言程序設計。題外話

在lua中,os.execute等同于c中的system函數,因此如果主進程執行lua邏輯,同時在處理SIGCHLD信號時使用waitpid捕獲子進程退出狀態,那么lua中使用os.execute時需要注意這一點。

1 #include

2 #include

3 #include

python報錯繼續執行、4 #include

5 #include

6 #include "errno.h"

7

8 voidSigChildFunc()9 {10 pid_t pid;11 intstatus;12

python列表、13 //capture1 begin

14 pid = waitpid(-1, &status, WNOHANG);15 if(pid > 0)16 {17 printf("capture SIGCHLD1\n");18 }19 else

20 {21 printf("SigChildFunc error! errno=%d\n", errno);22 }23 //capture1 end24

25 //capture2 begin26 //pid = waitpid(-1, &status, WNOHANG);27 //if(pid > 0)28 //{29 //printf("capture SIGCHLD2\n");30 //}31 //else32 //{33 //printf("SigChildFunc error! errno=%d\n", errno);34 //}35 //capture2 end

36 }37

38 void SignalCB(intSignal)39 {40 switch(Signal)41 {42 caseSIGCHLD:43 SigChildFunc();44 break;45 default:46 break;47 }48 }49

50 intmain()51 {52 signal(SIGCHLD, SignalCB);53

54 //test system begin

55 system("ls");56 //test system end57

58 //test fork begin59 //pid_t pid = fork();60 //if(pid < 0)61 //{62 //printf("fork error! errno=%d\n", errno);63 //}64 //else if(pid == 0)65 //{66 //printf("this is child.\n");67 //exit(0);68 //}69 //

70 //printf("this is parent.\n");71 //sleep(3);72 //test fork end

73

74 return 0;75 }

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

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

发表评论:

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

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

底部版权信息