0

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

我仍然迷路,试图多管我的程序。当我运行该程序时,它会进入一个只需要一些输入的状态 - 就像,也许是因为我没有在我的管道过程中获得第二个程序的输入。

我试图遵循这篇文章中的代码: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为第二个参数提供一个。

inside看起来也很可疑,因为您似乎正在为第一个参数提供完整的参数列表 execvpexecute_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

修复警告是个好主意,警告是你的朋友。

于 2012-10-01T18:38:28.640 回答