首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么更改了默认的SIGPIPE处理程序?

为什么更改了默认的SIGPIPE处理程序?
EN

Stack Overflow用户
提问于 2018-12-16 20:02:09
回答 1查看 788关注 0票数 1

我正在做一个测试,有人问我如何让“读”睡眠或“写”停止进程。

对于后者,我不明白为什么我的sigpipe确实被提升了,但并没有停止这个过程:

代码语言:javascript
复制
#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被忽略了吗?原因?

解决方案-

代码语言:javascript
复制
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库的影响。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53801914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档