控件是否在“返回”之后返回;execvp();?

控件是否在“返回”之后返回;execvp();?,c,exit,execvp,C,Exit,Execvp,“execvp()”将当前程序替换为要执行的程序(当然是在同一进程上下文中)。因此,将任何printf()调用放在execvp()之后都不起作用。这是文件上说的,我也证实了这一点 但是,为什么需要退出呢。。?控件是否会返回到post execvp()语句 如果有任何指点,我将不胜感激 谢谢如果函数失败,它将返回 如果其中一个exec函数返回调用进程映像,则发生错误;返回值应为-1,并且应设置errno以指示错误 \u exit()允许正确终止进程并返回退出代码,即使exec失败。如果execvp

“execvp()”将当前程序替换为要执行的程序(当然是在同一进程上下文中)。因此,将任何printf()调用放在execvp()之后都不起作用。这是文件上说的,我也证实了这一点

但是,为什么需要退出呢。。?控件是否会返回到post execvp()语句

如果有任何指点,我将不胜感激


谢谢

如果函数失败,它将返回

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


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

如果
execvp
失败,将调用
\u exit

execvp
的手册页上说:

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


需要注意的一点是,您通常不希望对流程的退出状态进行签名(如果可移植性很重要的话)。当出现故障时,
exec()
可以自由返回-1,但它会返回-1,这样您就可以在子代码中处理该故障

子项的实际
\u exit()
状态应为0-255,具体取决于引发的
errno

execve()syscall可能会失败。这样做的典型原因是文件不存在或不可执行
execvp()
环绕
execve()
添加路径搜索和默认环境处理(实际上总是您想要的!),因此它添加了其他一些故障模式,特别是尝试使用不在用户路径上的简单名称运行某些程序。在任何情况下,失败就是失败,当它发生时,除了报告它出了问题并使(现在无用的)子进程脱离道奇之外,你没有什么可以做的。(最简单的错误报告方法是打印错误消息,可能使用
peror()
,但也有其他方法。)


与更普通的
exit()
相反,您需要
\u exit()
的原因是您想退出子进程,但不想运行与父进程关联的任何已注册清理代码。好的,很多可能是无害的,但是像向套接字或其他东西写告别消息这样的事情是不好的,而且通常根本不清楚使用
atexit()注册了什么。让父进程担心它的资源;这个孩子基本上只拥有它的堆栈框架

谢谢你,肯尼特。好的,那么在动态分配“args”的情况下,malloc'ed()变量应该如何释放呢?@Ajay:OS应该在进程结束时清理它们。您缺少
pid=fork()从上一行开始。这有点重要!或者如果((pid=fork())<0)致命(“fork失败”)因为这都是关于失败的系统调用。

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