1

fork() で複数の子プロセスを作成し、execl() で実行ファイルを実行させました。

失敗した execl() があるかどうかを確認したい (例: 存在しないファイルを実行しようとする)。によって、すべてのプログラムを execl() しようとし、そのうちの 1 つが失敗した場合は、start が任意のプログラムと通信する前に 1 を返します。

ここに参照コードがあります(すべての設定が正しいと仮定します)

#DEFINE NUMBEROFCHILD 4
char** exeFile = {"./p1", "./p2", "./p3", "nonexist"); //"nonexist" is a non-exist program
int main(int argc, char** argv){
     pid_t childPID [numberOfChild];

     for (int i = 0; i<numberOfChild; i++) {
          //setting up pipes
          pid_t childPID[i] = fork();

          if(childPID[i] < 0) {
               //close all pipes and quit
          }else if (childPID[i] == 0) {
               //redirect pipe
               execl(exeFile[i],"args",(char*)0;
               return 1; 
               //I'm expecting this to return when it try to execute "nonexist"
               //but it didn't and keep running successed execl()
          }else {
               //close un-use pipes
          }
     }

     while(true) {
          for (int i = 0; i<numberOfChild; i++) {
               //communicate with childs through pipe
          }
     }

     for (int i = 0; i<numberOfChild; i++) {
          //close reminded pipes
          if (waitpid(childPID[i], NULL, 0) == -1){
               return 1;
          }
     }
     return 0;
}

このプログラムはまだメッセージを「存在しない」に送信しました (ただし、期待どおりに何も返されませんでした)。

とにかく私の目標を達成する方法はありますか?ありがとうございました!

4

2 に答える 2

2

pipe()close-on-exec に設定された の一方の端を子に与えるように手配できます。

失敗した後execl()(つまり、呼び出しが返された場合)、子プロセスwrite()はパイプを使用します。親がパイプの最後で何かを受信した場合 (チェックpoll()など)、子が失敗したことがわかります。

子からのメッセージに子の識別子が含まれている場合、パイプはすべての子で共有できます。write()ただし、アトミックになるように十分に小さく保つようにしてください。

于 2016-09-29T20:50:06.980 に答える
0

あなたの目標を達成するための唯一の堅牢な(しかし非常に風変わりで、おそらくあまり移植性がない)方法は、を使用することptraceです。親はPTRACE_TRACEEXECオプションを設定し、すべての子をフォークwait()し、ループします。子供がする

    } else if () {
        ptrace(PTRACE_TRACEME, ...);
        execl(...);
    }

wait親は、すべての子が終了を報告するまでループし続けPTRACE_EVENT_EXECます。最初のケースでは、execが成功し、子プロセスが停止しました。すべての子供が報告したことを確認し、その状態に満足したら、すべてptrace(PTRACE_DETACH, ...)の子供に行い、必要に応じて続行します。

于 2016-09-29T22:25:12.833 に答える