execve的返回状态

问题描述:

我想将退出状态0从execve进程发送到启动它的进程。 因为成功execve永远不会返回,所以我无法做任何事情之后。但如果execve运行成功,我想要。execve的返回状态

由于提前

+1

这个链接可以帮助你http://*.com/questions/13532391/how-to-get-error- of-execvp-in-the-fork – MOHAMED 2013-03-19 10:44:26

+0

OP希望父级知道孩子的'exec'成功进行。可以通过多种方式(通过管道或特殊的退出状态)向父节点报告“exec”失败,但“exec”成功很难确认,因为成功的'exec'定义意味着我们的进程不再运行。 – user4815162342 2013-03-19 10:53:25

+0

@ user4815162342:用“* ...一个孩子的'exec' ... *”表示创建孩子本身的exec或由儿童完成的一个exec(这个转变是由exec创建的'由父母)? – alk 2013-03-19 11:07:20

等待您处理由fork()完成启动,您可以使用wait()

/* parent */ 
int status; 
while (wait(&status) != uproc.pid) { 
    printf("waiting for child to exit"); 
    } 

,并在此基础上question

孩子的退出状态是由提供wait函数,在status变量中。

您可以通过使用WEXITSTATUS宏获得退出状态,但是只有当程序正常退出(即所谓的exit或从main函数返回):

if (WIFEXITED(status)) 
    printf("Child exit status: %d\n", WEXITSTATUS(status)); 
else 
    printf("Child exited abnormally\n"); 
+0

这不会验证'exec' *成功*,只是程序以成功状态退出。当执行长时间运行的程序时,这可能会产生差异。 – user4815162342 2013-03-19 10:51:04

您可以验证EXEC 通过成功使用FD_CLOEXEC

  • 创建管道。

  • fork。

  • 在子中,关闭管道的读取端,并在管道的写入端设置FD_CLOEXEC标志。然后继续exec。如果exec成功,则由于FD_CLOEXEC,管道将自动关闭。如果exec失败,则向管道写入一个字节并退出。

  • 在父项中,关闭管道的写入结束并从读取结束读取。如果读取0字节(EOF),则表示exec成功。如果您读取管道中的一个字节,则表示exec失败。

在故障的情况下写在管的数据可以被用于传送错误的信息,如后execerrno值。

代码,错误检查略去了,应该是这样的:

int pipe_fds[2]; 
pipe(pipe_fds); 
if (!fork()) { 
    close(pipe_fds[0]); 
    fcntl(pipe_fds[1], F_SETFD, F_CLOEXEC); 
    execve(...); 
    write(pipe_fds[1], "", 1); 
    _exit(1); 
} 
else { 
    int n; 
    char out; 
    close(pipe_fds[1]); 
    n = read(pipe_fds[0], &out, 1); 
    if (n == 0) 
    printf("exec successful\n"); 
    else 
    printf("exec failed\n"); 
} 
+0

未能执行'exec',是否可以保证SIGCHLD信号将在EOF通知之前从孩子死亡关闭管道的事实中传递出来?我喜欢技术背后的想法;我只是想知道是否有比赛条件。 – 2013-03-19 11:05:07

+0

@JonathanLeffler我不认为有任何这样的保证,但它不应该是必要的。如果'exec'失败,通过管道发送一些数据很容易消除歧义。 – user4815162342 2013-03-19 11:29:52

+0

@JonathanLeffler我现在编辑的答案不再依赖'SIGCHLD'。 – user4815162342 2013-03-19 11:32:10