C中的多个管道,程序等待输入

时间:2012-10-01 17:12:21

标签: c pipe piping

我尝试编辑我的帖子,因为它有一些问题。

我仍然输了,试图对我的程序进行多重调整。当我运行程序时,进入一个只需要一些输入的状态 - 比如,也许是因为我没有在管道流程中输入第二个程序。

我试图按照这篇文章中的代码进行操作:Does this multiple pipes code in C makes sense?

我的代码如下所示:

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]);
}

1 个答案:

答案 0 :(得分:1)

你的execvp(cmd,numberFile);论点已经过时了,原型是:

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

不知道你的cmd是什么样的,但是你为第二个参数提供int

execvp中的execute_piping()也看起来很可疑,因为您似乎正在向第一个参数提供完整的参数列表。

注意:char *argv[]表示argv是指向char的指针数组。我没有在任何地方看到这一点,但您应该显示结构CmdShellCmd是什么。

我从你的代码中收到了这些警告:

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

最好修改警告,警告是你的朋友。