6

if(pid == 0)
{
      execvp(cmd, args);
      // printf("hello"); // apparently, putting this or not does not work.
      _exit(-1);
}
else
{
      // parent process work
}

“execvp()”将当前程序替换为要执行的程序(当然在同一个进程上下文中)。因此,例如,在 execvp() 之后进行任何 printf() 调用都将不起作用。这就是文档所说的,我也已经验证过了。

但是,为什么需要 _exit() ..?控制是否会返回到 execvp() 后的语句?

我将不胜感激任何指示。

谢谢

4

4 回答 4

6

如果失败,该函数将返回。

如果其中一个 exec 函数返回到调用进程映像,则发生错误;返回值应为-1,并设置errno以指示错误。

允许正确终止进程并_exit()返回退出代码,即使 exec 失败。

于 2010-05-19T07:03:40.307 回答
2

系统execve()调用可能会失败。这样做的典型原因是文件不存在或不可执行。execvp()环绕execve()添加路径搜索和默认环境处理(实际上总是你想要的!),因此它添加了另外一些失败模式,特别是尝试运行不在用户路径上的简单名称的东西。无论如何,失败就是失败,当它发生时你无能为力,除了报告它出错并让(现在无用的)子进程脱离闪避。(最简单的错误报告方法是打印错误消息,可能带有perror(),但还有其他的。)

你需要_exit()而不是更正常exit()的原因是因为你想退出子进程你不想运行任何与父进程关联的注册清理代码。好的,其中很多可能是无害的,但是像向套接字写入再见消息之类的事情会很糟糕,而且注册的内容通常根本不明显atexit()。让父进程操心它的资源;孩子基本上只拥有它的堆栈框架!

于 2010-05-19T09:18:20.243 回答
1

如果execvp失败,_exit将被调用。

execvp的手册页说:

返回值
如果任何 exec() 函数返回,则将发生错误。返回值为-1,会设置全局变量errno来表示错误。

于 2010-05-19T07:05:02.637 回答
0

需要注意的一件事是,您通常不希望对进程的退出状态进行签名(如果可移植性很重要)。虽然exec()在失败时可以自由返回 -1,但它会返回它,以便您可以在子代码中处理该失败。

孩子的实际_exit()状态应该是 0 - 255,这取决于errno所提出的内容。

于 2010-05-19T09:06:53.147 回答