C 向子进程发送信号父进程

标签 c unix process

我正在尝试解决我遇到的一个问题,子进程运行 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/

相关文章:

c - 如果已经设置了警报, alarm() 的返回值是多少

c++ - 为什么 OSX 事件监视器不显示我启动的进程?

c - 高效地重写 for 循环,C

c - Gstreamer-0.10 代码无法通过 udp 传输网络摄像头视频

bash - 尝试使用 BOXEE 中的 bash 启动 XBMC

Java:以编程方式打开控制台并从中执行命令

c# - 打开进程(记事本)后如何将焦点设置回表单?

c - 一维数组乘法

来自 mpfr 库的 Cygwin 的 gcc 编译器警告

java - 在 UNIX 中通过 crontab 安排作业