2

私はこのコードを持っています:

            close(pipefd[0]);

            fp = fopen(argv[1], "r");

            if(fp)
            {
                while((c = getc(fp)) != EOF)
                {
                    if((write(pipefd[1], c, 1)) < 1)
                    {
                        fprintf(stderr, "Write to pipe failed.\n");
                        exit(EXIT_FAILURE);
                    }
                }
            }

            fclose(fp);

            close(pipefd[1]);   
            waitpid(childPID, &status, 0);
            exit(EXIT_SUCCESS);

私の理解では、ファイルを開いてその内容をパイプに書き込む必要があります。これが別のプログラムの標準になります。私のテストでは、書き込み以外はすべて機能していることが示されていますが、なぜ機能しないのかわかりません。

私はただ愚かなことをしているのですか?

編集:はい、私は愚かなことをしていました。

問題は書き込みにあると思いましたが(cを&cにする必要があることを修正した後)、実際には子プロセスにあり、dup2()を使用してパイプの読み取り端を子プロセスのstdinにリンクしていました。私は後ろ向きに議論をしました。fork()以降の動作コードは次のとおりです。

childPID = fork();
if (childPID == 0)
{
    //child code
    //printf("In the child process.\n");
    dup2(pipefd[0], STDIN_FILENO);
    close(pipefd[1]);

    execv(argv[2], paramList);
    printf("You shouldn't be seeing this.\n");
}
else
{
    //parent code
    //printf("In the parent process\n");
    close(pipefd[0]);

    fp = fopen(argv[1], "r");

    if(fp)
    {
        while((c = getc(fp)) != EOF)
        {
            if((write(pipefd[1], &c, 1)) < 1)
            {
                fprintf(stderr, "Write to pipe failed.\n");
                perror("write");
                exit(EXIT_FAILURE);
            }
        }
    }

    fclose(fp);

    close(pipefd[1]);   
    waitpid(childPID, &status, 0);
    exit(EXIT_SUCCESS);
}

うまくいけば、これは他の誰かが4日間机に頭をぶつける必要がないのに役立ちます!そして、お答えする時間のある皆様、ありがとうございました。

4

1 に答える 1

2

write()文字(本質的には数値)ではなく、書き込むデータのバッファーへのポインターを取ります。

答えは簡単です。に渡す代わりにcwrite()のアドレスを渡しますc&c

于 2012-05-26T22:17:28.007 に答える