gpt4 book ai didi

c - execvp/fork——如何捕捉不成功的执行?

转载 作者:太空狗 更新时间:2023-10-29 14:50:00 28 4
gpt4 key购买 nike

现在我正在编写一个必须执行子进程的 C 程序。我不会同时执行多个子进程或其他任何操作,所以这非常简单。我确实成功地执行了内置的 shell 程序(即 cat 和 echo 之类的东西),但我还需要能够判断其中一个程序何时无法成功执行。我正在尝试使用以下简化代码:

int returnStatus; // The return status of the child process.
pid_t pid = fork();

if (pid == -1) // error with forking.
{
// Not really important for this question.
}
else if (pid == 0) // We're in the child process.
{
execvp(programName, programNameAndCommandsArray); // vars declared above fork().

// If this code executes the execution has failed.
exit(127); // This exit code was taken from a exec tutorial -- why 127?
}
else // We're in the parent process.
{
wait(&returnStatus); // Wait for the child process to exit.

if (returnStatus == -1) // The child process execution failed.
{
// Log an error of execution.
}
}

例如,如果我尝试执行 rm fileThatDoesntExist.txt,我会认为这是一个失败,因为该文件不存在。我怎样才能做到这一点?此外,虽然 execvp() 调用成功执行了内置的 shell 程序,但它不会在可执行文件的当前目录中执行程序(即此代码在其中运行的程序);为了让它在当前目录中运行程序,我还需要做些什么吗?

谢谢!

最佳答案

这是一个经典的问题,有一个非常优雅的解决方案。在 fork 之前,创建一个 pipe在 parent 。在fork之后,父级应该关闭管道的写入端,并阻止尝试 read从阅读端。 child 应该关闭阅读结束并设置 close-on-exec 标志,使用 fcntl , 用于写作结束。

现在,如果 child 调用execvp成功,管道的写入端将关闭,没有数据,read在父项中将返回 0。如果 execvp在 child 中失败,将错误代码写入管道,read在父级中将返回非零值,已读取父级要处理的错误代码。

关于c - execvp/fork——如何捕捉不成功的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13710003/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com