0
私は自分のシェルを書いて三重配管を扱う関数を書いたが、execveの後にシェルが終了する問題がある。私は問題は私が余分な時間をフォークする必要があると思う?しかし、私は完全に配管されたプログラムを完璧に実行するので、どこにあるのかは完全にはわかりません。また、この実装でwait(2)を使用することはありません。その実装にも何か関係があるかどうかはわかりません。ありがとうexecveが元のプログラムを終了するのを止める方法
int fd[2];
int fd2[2];
if (pipe(fd) == -1)
{
perror("ERROR CREATING PIPE");
return;
}
pid_t pid = fork();
if (args4[0] != NULL)
{
switch(pid)
{
case -1:
printf("%s\n", "fail to fork");
return;
case 0:
if (pipe(fd2) == -1)
{
perror("ERROR CREATING PIPE");
return;
}
switch(pid = fork())
{
case -1:
printf("%s\n", "fail to fork");
return;
break;
case 0:
if (dup2(fd2[1], STDOUT_FILENO) == -1)
{
printf("%s\n", "fail to dup");
return;
}
close(fd2[0]);
close(fd2[1]);
execve(args2[0], args2, environ);
exit(1);
default:
if (dup2(fd2[0], STDIN_FILENO) == -1)
{
printf("%s\n", "fail to dup");
return;
}
if (dup2(fd[1], STDOUT_FILENO) == -1)
{
printf("%s\n", "fail to dup");
return;
}
close(fd2[0]);
close(fd2[1]);
execve(args3[0], args3, environ);
exit(2);
}
exit(3);
default:
if (dup2(fd[0], STDIN_FILENO) == -1)
{
printf("%s\n", "fail to dup");
return;
}
close(fd[0]);
close(fd[1]);
printf("%s\n", "4");
execve(args4[0], args4, environ);
exit(4);
}
}
呼び出すサブプロセスごとにforkする必要があります。 –
はい私は理解するために、どのプロセスをフォークするかを理解するのに問題があります。私はそれがexecve(args2 [0]、args2、environ)であると思います。なぜなら、それが呼び出す最後のプロセスであるからです。私はすべての3人の幹部の前にフォークを試みましたが、それは助けにはなりません。 – ricefieldboy
こんにちは。ありがとうございました。 args4 – ricefieldboy