1

プロセスをフォークしてコマンドを実行しようとしています。名前付きパイプを作成し、STDOUT をパイプに書き込む子プロセスからコマンドを実行しようとしています。親プロセスはパイプから読み取ります。私の問題は、親プロセスがパイプからデータを完全に読み取っていないことです。これがコードです。

fifo_fd = mkfifo(MY_FIFO, 0666);
FILE *fp = fdopen(fifo_fd, "r");
childpid = fork();
if (childpid == 0)
{
   dup2(fifo_fd, STDOUT_FILENO);
   dup2(fifo_fd, STDERR_FILENO);
   close(fifo_fd);
   execv(arg_list[0], arg_list);
   _exit (127);
}
else
{
   //parent process
   if(waitpid(childpid, &status,WNOHANG ) == -1) {
     // now we kill the child and return failure.
   }

   fcntl(fd, F_SETFL, O_NONBLOCK);

   while((fgets(buf, sizeof(buf)-1,fp))) {
   strcat(result,buf); //we copy the buf to result
}
return success;
}
4

1 に答える 1

0

fifo ではなくパイプを使用したいので、ファイルシステム エントリを作成する必要はありません。@Christian が言うように、両方のプロセスが同時に実行されていることを確認する必要もあります。そうしないと、パイプ/fifo がブロックされ、プログラムがハングする可能性があります。

次のようなことを試してください。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
    int pipe_fd[2];
    pipe(pipe_fd);

    if (fork() == 0) {
        dup2(pipe_fd[1], STDOUT_FILENO);
        dup2(pipe_fd[1], STDERR_FILENO);
        close(pipe_fd[0]);
        close(pipe_fd[1]);
        char *arg_list[] = {"/bin/echo", "hello", 0};
        execv(arg_list[0], arg_list);
        __builtin_unreachable();

    } else {
        close(pipe_fd[1]);
        char buf[32];
        int count;
        for (;;) {
            count = read(pipe_fd[0], buf, sizeof(buf));
            if (count <= 0) break;
            write(STDOUT_FILENO, buf, count);
        }
    }

    return 0;
}
于 2012-09-10T13:15:37.633 に答える