1

の使用に関する正式な教育を受けていないという事実を前置きしたいpipesので、これが私の最初の冒険です。私の状況に似た質問が見つからなかったことは言うまでもありません。

注: これは学校の課題のためのより大きなプロジェクトの一部であるため、誰かに私のためにこれを行うよう依頼しているわけではありません。いくつかの指示/役立つコード セグメントが必要です。(「詐欺師」の発言を避けるために、これをできるだけ一般的なものにしようとしました。)

親プロセスがandを使用して子を生成し、 a を使用して出力を親に送り返す要素を実行しようとしていfor-loopます。使用しようとしている一般的なコードと、発生したエラー/問題を次に示します。int kkfork()execl()pipe()

注: helloworld= でコンパイルされた実行可能GCCファイルprintf("hello world\n");

int k = 10; //The number of children to make
int fd[2]; //Used for each pipe
int readFromMe[k]; //Holds the file IDs of each pipe fd[0]
int writeToMe[k]; //Holds the file IDs of each pipe fd[1]
int processID[k]; //Holds the list of child process IDs

//Create children
int i;
for(i = 0; i < k; i++)
{
    if(pipe(fd) == -1)
    {
        printf("Error - Pipe error.\n");
        exit(EXIT_FAILURE);
    }

    //Store the pipe ID
    readFromMe[i] = fd[0];
    writeToMe[i] = fd[1];

    if((processID[i] = fork()) == -1)
    {
        fprintf(stderr, "fork failure");
        exit(EXIT_FAILURE);
    }

    //If it is a child, change the STDOUT to the pipe-write file descriptor, and exec
    if(processID[i] == 0)
    {
        dup2 (writeToMe[i], STDOUT_FILENO);
        close(readFromMe[i]);

        execl("./helloworld", (char *)0);
    }

    //If it is the parent, just close the unnecessary pipe-write descriptor and continue itterating
    else
    {
        close(writeToMe[i]);
    }
}

//Buffer for output
char output[100000];

//Read from each pipe and print out the result  
for(i = 0; i < k; i++)
{
    int r = read(readFromMe[i], &output, (sizeof(char) * 100000));

    if(r > 0)
    {
        printf("result = %s\n", output);
    }

    close(readFromMe[i]);
}   

プログラムからまったく出力が得られないため、この問題が発生している理由を突き止めようとしています。

4

2 に答える 2

1

印刷関数で「r」の値を出力してみてください。読み取りで、表示されていないエラー(おそらくEPIPE)が返されていると思われます。また、サンプルコードは、意図したように出力されるのではなく、printf'c'を試みています。

于 2013-02-21T06:02:18.910 に答える
1

おそらく無関係ですが、あなたはexecl間違って呼んでいます。プログラムの後の追加の引数はargv、他のプログラムへの配列がmain機能するものです。ご存じのとおり、プログラム名というエントリが常に 1 つあります。したがって、次のように呼び出す必要があります。

execl("./helloworld", "helloworld", NULL);

問題に関連して、エラーも確認する必要があります。実際には失敗する可能性があります。

于 2013-02-21T05:53:16.007 に答える