0
我正在嘗試爲殼體制作管道系統,但它不能按預期工作。C殼的管道系統
void pipes (char *listaCommand[], int end, char **argv)
{
int cont = end;
for (cont;listaCommand[cont]; cont++)
{
if (listaCommand[cont] != NULL)
{
if (!strcmp(listaCommand[cont],"|")){
int pid2, status;
int pipefd[2], ret;
listaCommand[cont] = NULL;
ret = pipe (pipefd);
if (ret < 0) fatal();
/* Now fork. */
pid2 = fork();
if (pid2 <0) fatal();
if (pid2 > 0)
{
printf ("P: waiting for child\n");
wait (&status);
close(STDIN_FILENO);
dup(pipefd[0]);
close(pipefd[0]);
close(pipefd[1]);
/*execvp (auxCommand[0], auxCommand);*/
pipes(listaCommand, cont+1, argv);
/*break;*/
}
else
{
close (STDOUT_FILENO);
dup (pipefd[1]);
close (pipefd[1]);
close (pipefd[0]);
}
}
}
}
if (end >= 3)
{
printf("%s \n", listaCommand[end-1]);
}
execvp (listaCommand[end], listaCommand);
printf ("%s: command not found.\n", listaCommand[end]); /* Exec failed. */
exit(EXIT_FAILURE);
}
如果我使用像ls |排序,它的工作原理,但如果ls有任何參數,它不起作用,因爲某些原因,listaCommand [cont]其中==「|」不是NULL,所以我只得到 ls:option - 'a'無效。
listaCommand have
[0] = "ls"
[1] = "-al"
[2] = "|"
[3] = "sort"
這裏有什麼問題? –
爲什麼listaCommand [cont]在哪裏等於「|」對於執行「ls」命令的進程是不是NULL,即使我在創建新進程之前爲它賦予NULL值?這兩個過程應該具有相同的價值。 – Dante003