4

以下に示すように、標準入力と非標準のファイル記述子(3または4)の両方から入力を受け取るプログラム「サンプル」があります

int pfds[2];
pipe(pfds);    
printf("%s","\nEnter input for stdin");
read(0, pO, 5);    
printf("\nEnter input for fds 3");
read(pfds[0], pX, 5);

printf("\nOutput stout");
write(1, pO, strlen(pO));    
printf("\nOutput fd 4");
write(pfds[1], pX, strlen(pX));

現在、execvを使用して子プロセスで上記のプログラム(サンプル)を実行する別のプログラム「Operator」があります。今私が欲しいのは、 "Operator" を介して "Sample" に入力を送信することです。

4

1 に答える 1

7

子プロセスを fork した後、 を呼び出す前にexecve、 を呼び出して、子プロセスの記述子をパイプの読み取り側にdup2(2)リダイレクトする必要があります。stdin以下は、エラー チェックをあまり行わない単純なコードです。

pipe(pfds_1); /* first pair of pipe descriptors */
pipe(pfds_2); /* second pair of pipe descriptors */

switch (fork()) {
  case 0: /* child */
    /* close write ends of both pipes */
    close(pfds_1[1]);
    close(pfds_2[1]);

    /* redirect stdin to read end of first pipe, 4 to read end of second pipe */
    dup2(pfds_1[0], 0);
    dup2(pfds_2[0], 4);

    /* the original read ends of the pipes are not needed anymore */
    close(pfds_1[0]);
    close(pfds_2[0]);

    execve(...);
    break;

  case -1:
    /* could not fork child */
    break;

  default: /* parent */
    /* close read ends of both pipes */
    close(pfds_1[0]);
    close(pfds_2[0]);

    /* write to first pipe (delivers to stdin in the child) */
    write(pfds_1[1], ...);
    /* write to second pipe (delivers to 4 in the child) */
    write(pfds_2[1], ...);
    break;
}

このようにして、親プロセスから最初のパイプに書き込むものはすべて記述子0( stdin) を介して子プロセスに配信され、2 番目のパイプから書き込むものはすべて記述子にも配信さ4れます。

于 2011-05-10T18:00:10.393 に答える