0

投稿に問題があったため、投稿を編集しようとしています。

プログラムをマルチパイプしようとして、まだ迷っています。プログラムを実行すると、何らかの入力を受け取るだけの状態になります。おそらく、パイプ処理で 2 番目のプログラムに入力を取得していないためです。

この投稿のコードをたどってみました: C のこの複数のパイプ コードは意味がありますか?

私のコードは次のようになります。

int status;
int newpipe[2];
int oldpipe[2];

pid_t pid;
int countcmds = 0;
while (firstCmd != NULL) {
    printf("En iteration \n");
    if (firstCmd -> next != NULL) {
        pipe(newpipe);
    }
    pid = fork();

    if(pid == 0){
        if (firstCmd -> prev != NULL) {
            dup2(oldpipe[0],0);
            close(oldpipe[0]);
            close(oldpipe[1]);
        }
        if (firstCmd -> next != NULL) {
            close(newpipe[0]);
            dup2(newpipe[1],1);
            close(newpipe[1]);
        }
        char** file = firstCmd -> cmd;
        char* specfile = *file;
        execvp(specfile, file);
    }
    else{
        waitpid(pid, &status, 0);
        if (firstCmd -> prev != NULL) {
            close(oldpipe[0]);
            close(oldpipe[1]);
        }
        if(firstCmd -> next != NULL){
            oldpipe[0] = newpipe[0];
            oldpipe[1] = newpipe[1];
        }
        countcmds++;
        firstCmd = firstCmd -> next;
    }
}
if(countcmds){
    close(oldpipe[0]);
    close(oldpipe[1]);
}
4

1 に答える 1

1

あなたのexecvp(cmd,numberFile);議論はかなり外れています。プロトタイプは次のとおりです。

int execvp(const char *file, char *const argv[]);

あなたがどのようにcmd見えるかわかりませんがint、2番目のパラメーターに を指定しています。

最初のパラメーターに完全な引数リストを提供しているように見えるという点で、execvp内部execute_piping()も疑わしく見えます。

注: は、 へのポインタの配列であるchar *argv[]ことを意味します。私はそれをどこにも見ませんが、構造体と構造体が何であるかを示す必要があります。argvcharCmdShellCmd

私はあなたのコードからこれらの警告を得ました:

gash.c:33: warning: passing argument 1 of ‘execvp’ from incompatible pointer type
gash.c:33: warning: passing argument 2 of ‘execvp’ makes pointer from integer without a cast

警告を修正するのは良い考えです。警告はあなたの友達です。

于 2012-10-01T18:38:28.640 に答える