我尝试编辑我的帖子,因为它有一些问题。
我仍然输了,试图对我的程序进行多重调整。当我运行程序时,进入一个只需要一些输入的状态 - 比如,也许是因为我没有在管道流程中输入第二个程序。
我试图按照这篇文章中的代码进行操作: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]);
}
答案 0 :(得分:1)
你的execvp(cmd,numberFile);
论点已经过时了,原型是:
int execvp(const char *file, char *const argv[]);
不知道你的cmd
是什么样的,但是你为第二个参数提供int
。
execvp
中的execute_piping()
也看起来很可疑,因为您似乎正在向第一个参数提供完整的参数列表。
注意:char *argv[]
表示argv
是指向char
的指针数组。我没有在任何地方看到这一点,但您应该显示结构Cmd
和ShellCmd
是什么。
我从你的代码中收到了这些警告:
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
最好修改警告,警告是你的朋友。