使用 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() 和信号随机挂起或停止执行程序的主要内容,如果未能解决你的问题,请参考以下文章

深入理解计算机系统 第八章 异常控制流(2)

在几个选择查询或插入查询后休眠挂起

从PowerShell挂起或休眠

OWB 映射挂起或花费太长时间 - 可能锁定?

jquery拖放挂起或卡住Android浏览器

FxCop 似乎已挂起或死锁:可能会忽略检查中的某些方法