以下に、複数のクライアントからリクエストを受け取り、exec を介して数学演算を呼び出し、呼び出されたプロセスからの結果を待って、パイプを介してそれぞれのクライアントに結果を返すアプリケーションの簡単なコード スニペットを示します。
case '+':
fret=fork();
if(fret==-1)
perror(" error in forking at add\n");
else if(fret==0)
{//child
sprintf(s_rp,"%d",p_op[0]);
sprintf(s_wp,"%d",p_op[1]);
argm[0]="add";
if((ret= execve(argm[0],argm,argp))== -1)
{
printf("exeve of add failed \n");
exit(1);
}
}
else
{//parent
write(p_op[1],&request,sizeof(request));
if((ret=waitpid(fret,&x,0))==-1)
perror("Error with wait at +\n");
read(p_op[0],&result,sizeof(result));
write(fd_res,&result,sizeof(result));
}
break;
ここで、親が最初にすばやく実行されているという単純な問題に直面しています。これにより、waitpid()
失敗し、通常waitpid()
は子が終了するのを待ちますが、私の場合、親がwaitpid()
失敗しても子は作成されません
私の質問は、sleep()
(これで問題は解決しましたが、プログラムの実行が遅くなります!!)またはIPC
親よりも先に子供を実行するようにフォークを確認するにはどうすればよいですか
これを考えたとき、シグナルを使用して親やセマフォをブロックして原子性を実現するなど、いくつかのアプローチが頭に浮かびました。子供が最初に実行され、次に親が実行を開始することを確認する簡単なアプローチはありますか