我正在做一个测试,有人问我如何让“读”睡眠或“写”停止进程。
对于后者,我不明白为什么我的sigpipe确实被提升了,但并没有停止这个过程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#define READING 0
#define WRITING 1
#define DESCRIPTOR_COUNT 2
void signal_handler(int signal){
printf("sigpipe received\n");
}
int main(void)
{
int tube[DESCRIPTOR_COUNT];
pipe(tube);
// signal(SIGPIPE, signal_handler);
close(tube[READING]);
if(write(tube[WRITING], "message", 8)<0)
if(errno==EPIPE)
printf("EPIPE returned\n");
printf("123");
return EXIT_SUCCESS;
}
不带信号的()(带引号)
带signal() (未加引号)的
确实收到了SIGPIPE,但是在我不处理它的情况下,进程应该停止,但是因为我可以写"123“,这意味着进程没有停止。为什么?
另外,我在Fedora 28上,我使用的是代码块17.12。
SIGPIPE被忽略了吗?原因?
解决方案-
struct sigaction action;
action.sa_handler = SIG_DFL;
sigaction(SIGPIPE, &action, 0);
用它替换signal()
将具有预期的默认行为!
编辑我现在已经将标题从"SIGPIPE不停止进程“更改为”为什么默认SIGPIPE处理程序被更改?“
======================================================
应答
在与来自代码块的人交谈之后,代码块使用wxWidgets,并且在linux (这里是fedora 28 )上,wxWidgets使用gtk库,正如Mark Plotnick在注释中所解释的那样,gtk改变了SIGPIPE的信号处理程序,因为代码块使用fork或exec来运行代码,所以通过代码块运行的代码会受到gtk库的影响。
https://stackoverflow.com/questions/53801914
复制相似问题