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()后返回语句?
我会感激任何指示。
由于
答案 0 :(得分:6)
如果失败,该函数将返回。
如果其中一个exec函数返回到调用进程映像,则发生错误;返回值应为-1,并设置errno以指示错误。
_exit()
允许正确终止进程并返回退出代码,即使exec失败也是如此。
答案 1 :(得分:1)
如果execvp
失败,则会调用_exit
。
execvp
的手册页说:
返回值
如果任何exec()函数返回,则会发生错误。返回值为-1,将设置全局变量errno以指示错误。
答案 2 :(得分:1)
execve()
系统调用可能会失败。这样做的经典原因是文件不存在或不可执行。 execvp()
包围execve()
以添加路径搜索和默认环境处理(几乎总是你想要的!),因此它增加了另外几种失败模式,特别是试图运行一个简单名称不在的东西用户的路径。在任何情况下,失败都是失败的,并且当它发生时你可以做很多事情,除非报告它已经出错并获得(现在无用的)子进程Out Of Dodge。 (最简单的错误报告方法是打印错误消息,可能是perror()
,但还有其他消息。)
您需要_exit()
而不是更正常exit()
的原因是因为您想要退出子进程但是您不想运行任何已注册的清理与父进程关联的代码。好吧,其中很多可能是无害的,但做一些事情,比如将一条好消息写入套接字或其他东西都会很糟糕,而atexit()
注册的内容往往并不明显。让父进程担心其资源;孩子基本上除了它的堆叠框架之外什么都没有!
答案 3 :(得分:0)
有一点需要注意,您通常不希望签署流程的退出状态(如果可移植性很重要)。虽然exec()
在失败时可以自由返回-1,但它会返回,以便您可以在子代码中处理该失败。
子项的实际_exit()
状态应为0 - 255,具体取决于errno
引发的内容。