我正在尝试解决我遇到的一个问题,子进程运行 execvp() 并且需要让父进程知道它是否返回。因此,在 execvp() 返回后(因为出现错误),我如何告诉父级这个特定事件已经发生以便它可以处理它。
有一种方法是通过我正在使用的管道写入一串文本,然后从父级读取它……但它似乎有点草率。有没有更好的办法?
谢谢!
编辑:这是我正在尝试的一些代码,我似乎无法让读取返回。
int errorPipe[2];
signal( SIGPIPE, SIG_IGN );
int oldflags = fcntl (errorPipe[0], F_GETFD, 0);
oldflags |= FD_CLOEXEC;
fcntl (errorPipe[0], F_SETFD, oldflags);
oldflags = fcntl (errorPipe[1], F_GETFD, 0);
oldflags |= FD_CLOEXEC;
fcntl (errorPipe[1], F_SETFD, oldflags);
pipe( errorPipe );
// in the child..
char *error_message = "exec failed";
write( errorPipe[1], error_message, strlen(error_message)+1 );
exit(-1);
// in the parent
printf("read gives: %d\n", read(errorPipe[0], error_read, MAX_LINE_LENGTH) );
最佳答案
最简单的方法是使用设置了 FD_CLOEXEC
标志的管道,这样您就可以像检测失败一样轻松地检测到成功的 exec。如果出现故障,我会通过管道将整个错误消息写回父级,但您可以只写状态代码或任何其他有意义的内容。 (不过一定要写一些东西;没有写的东西一定是另一个可执行文件成功启动的标志。)
[编辑]:如何使用它:
如果 parent 需要等到它知道 child 是否成功运行了 execve()
(非系统调用),那么它应该在管道。结果为零表示成功。 (确保您已忽略 SIGPIPE
。)
如果父级有某种基于非阻塞IO和select()
(或poll()
或kqueue()
或 …) 然后等待管道变得可读,然后再尝试读取消息(如果 child 正确地执行了 execve()
,则长度将为零)。
关于C 向子进程发送信号父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719499/