使用 fork() 和信号随机挂起或停止执行程序
Posted
技术标签:
【中文标题】使用 fork() 和信号随机挂起或停止执行程序【英文标题】:Program hanged or stop execution randomly using fork() and signal 【发布时间】:2013-10-03 15:38:35 【问题描述】:我编写了一个程序,在其中创建了一个子进程。父进程和子进程都分两部分进行计算 - parent_part1, parent_part2 和 child_part1, child_part2。
我的目标是运行 (parent_part1,child_part1,parent_part2 ,child_part2) 序列让我们说 5 次。为此,我使用了 while(var_child++
现在,我将定义一个成功的计算是执行 (parent_part1,child_part1,parent_part2 ,child_part2) 序列 5 次并显示最终的正确值。
我想找到这样的 100 SUCCESSFUL 计算,并且出于相同目的,我使用了 OUTER 循环(即 while(t1++
这是什么原因以及如何克服? 先感谢您 。程序如下。
#include<stdio.h>
#include<signal.h>
int flagp=0,flagc=0,var_child=0,var_par=0;
void write_child()
if(flagc==0)
/* do some computation here*/
printf("Child_part1 \n");
flagc=1;
else
/* do some computation here*/
flagc=0;
printf("Child_part2 \n");
void write_parent()
if(flagp==0)
/* do some computation here*/
printf("Parent_part1 \n");
flagp=1;
else
/* do some computation here*/
printf("Parent_part2 \n");
flagp=0;
int main(int ac, char **av)
printf("Starting...\n");
int t1=0;
pid_t childpid = fork();
printf("childpid=%d,getppid()=%d \n",childpid,getppid());
while(t1++<100)
var_child=0;
var_par=0;
if ( childpid == 0 )
// child process
printf("\n\nt1=%d ",t1);
while(var_child++<10)
kill(getppid(), SIGCONT); //sending singal to parent
signal(SIGCONT, write_child);
pause();
else
//parent process
printf("\n\nt1=%d ",t1);
while(var_par++<10)
kill(childpid, SIGCONT); //sending singal to child
signal(SIGCONT, write_parent);
pause();
// end of else
return 0;
【问题讨论】:
这是我的示例输出:t1=1 父第 1 部分 t1=1 子第 1 部分 父第 2 部分 子第 2 部分 父第 1 部分 子第 1 部分 父第 2 部分 子第 2 部分 父第 1 部分 子第 1 部分父母第2部分 孩子第2部分 父母第1部分 孩子第1部分 父母第2部分 孩子第2部分 父母第1部分 孩子第1部分 父母第2部分 孩子第2部分。 . . t1=75 父第 1 部分 子第 1 部分 父第 2 部分 子第 2 部分 【参考方案1】:你确定这个逻辑是正确的吗?
while(var_par++<10)
除此之外,您还没有捕捉到来自父进程的信号。当子进程终止时,您正在创建许多僵尸进程,并且通过从子进程中杀死父进程,您正在创建孤儿。两者都将占用系统资源,并且可能会达到连续执行的上限。尝试捕捉信号并查看它的行为。
【讨论】:
乔,感谢您的回答。正如您所提到的“您没有从父进程中捕获信号”-但据了解,我在父进程中使用了信号(SIGCONT,write_parent)来缓存信号和信号(SIGCONT,write_child);在孩子缓存信号。我说的对吗? 当我的程序在执行过程中被卡住时,我也检查了僵尸(有时它按预期成功执行了 100 次),没有僵尸。要查看僵尸,我使用 top 命令和/或在其他终端 ps aux | grep Z。以上是关于使用 fork() 和信号随机挂起或停止执行程序的主要内容,如果未能解决你的问题,请参考以下文章