如何阻止execve退出原程序
问题描述:
我写了自己的shell并编写了一个处理三重管道的函数,但是我的shell在execve后退出时遇到问题。我相信这个问题是我需要多花点时间?但我不完全确定它在哪里,因为这完美地执行了管道程序。在这个实现中也没有使用等待(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);
}
}
答
您分叉了两次,所以您有3个进程。它们中的每一个都被execve创建的相应进程替换。因为execve()不会返回(成功),所以您将永远不会到达exit()语句。这里是你的代码重写,而不管道(您清楚了解如何设置的管道)和没有不必要的语句:
pid_t pid = fork();
if (pid) {
execve(args4[0], args4, environ);
}
else {
pid = fork();
if (pid) {
execve(args3[0], args3, environ);
}
else {
execve(args2[0], args2, environ);
}
}
看上面的重写代码可以更容易地看到,你会得到三个过程是这样:
args2 [0] | args3 [0] | arg4 [0]
您需要针对您打算调用的每个子进程进行分支。 –
是的,我明白,我无法确定要分叉的过程。我认为这将是execve(args2 [0],args2,environ),因为它是最后一次调用的过程。我已经在所有3位高管之前尝试过分叉,但没有任何帮助。 – ricefieldboy
没什么好愚蠢的。谢谢。分叉args4 – ricefieldboy