0

我编写了一个程序,在其中创建了一个子进程。父进程和子进程都在两部分进行计算 - parent_part1,parent_part2 和 child_part1,child_part2。

我的目标是运行 (parent_part1,child_part1,parent_part2 ,child_part2) 序列让我们说 5 次。为此,我使用了 while(var_child++<10) 和 while(var_par++<10) 并成功实现了它。

现在,我将定义一个成功的计算是执行 (parent_part1,child_part1,parent_part2 ,child_part2) 序列 5 次并显示最终的正确值。

我想找到这样的 100 SUCCESSFUL 计算,出于同样的目的,我使用了 OUTER 循环(即 while(t1++<100) ),但我没有得到 100 次 SUCCESSFUL 计算,有时我得到 40 SUCCESSFUL 结果,然后挂了在 parent_part1 或 parent_part2 或 child_part1 或 child_part2 等之后以及其他一些时候我得到 20 或 95 SUCCESSFUL 结果,并在 parent_part1 或 parent_part2 或 child_part1 或 child_part2 等之后挂起。

是什么原因以及如何克服呢?先感谢您 。程序如下。

#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;
} 
4

1 回答 1

0

你确定这个逻辑是正确的吗?

  while(var_par++<10)

除此之外,您没有捕捉到来自父进程的信号。当子进程终止时,您正在创建许多僵尸进程,并且通过从子进程中杀死父进程,您正在创建孤儿。两者都将占用系统资源,并且可能会达到连续执行的上限。尝试捕捉信号并查看它的行为。

于 2013-10-03T20:17:03.217 回答