0

以下に、複数のクライアントからリクエストを受け取り、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親よりも先に子供を実行するようにフォークを確認するにはどうすればよいですか

これを考えたとき、シグナルを使用して親やセマフォをブロックして原子性を実現するなど、いくつかのアプローチが頭に浮かびました。子供が最初に実行され、次に親が実行を開始することを確認する簡単なアプローチはありますか

4

1 に答える 1

1
  1. waitpid関数は、指定されたプロセスが終了するまでブロックします。などの理由で -1 が返されるEINTR可能性がありますが、呼び出しをループにwaitpid入れることで非常に簡単に解決できます。waitpidたとえば、 call が -1 と==をwaitpid返した場合、ループを続行します。戻り値についてはhttp://linux.die.net/man/3/waitpidを参照してください。errnoEINTR

  2. 子プロセスが作成される前にwaitpid呼び出しが実行されることはありません! 明らかに、waitpid関数は syscall の後に呼び出され、forksyscall の戻り値はfork-1 ではありません。したがって、その時点で、fork呼び出しはすでに返されています。つまり、子プロセスは既に存在します。

于 2014-07-10T17:00:05.840 に答える