0

子プロセスを作成したプログラムを作成しました。親プロセスと子プロセスの両方が、parent_part1、parent_part2 と child_part1、child_part2 の 2 つの部分で計算を行います。

私の目的は、(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 回実行することを ONE SUCCESSFUL 計算と定義し、最終的な正しい値を表示します。

そのような 100 SUCCESSFUL 計算を見つけたいのですが、同じ目的で OUTER ループ (つまり、 while(t1++<100) ) を使用しましたが、100 回の SUCCESSFUL 計算が得られず、時々 40 SUCCESSFUL の結果が得られ、ハングしました。 parent_part1 または parent_part2 または child_part1 または child_part2 などの後、また 20 または 95 の成功した結果を得て、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 に答える