#include <stdio.h>
#include <signal.h>

void sigpipe_handler(int signum) {
    printf("Caught SIGPIPE signal\n");
}

int main() {
    signal(SIGPIPE, sigpipe_handler);

    printf("Hello world!\n");
    fflush(stdout); //确保输出被立即写入到 stdout

    int fd[2];
    if (pipe(fd) == -1) {
        perror("pipe");
        return 1;
    }

    close(fd[0]); //关闭读管道
    if (write(fd[1], "test", 4) == -1) { //尝试向关闭的管道写入数据
        perror("write");
    }

    return 0;
}

程序中使用 signal 函数注册了一个 SIGPIPE 信号处理函数 sigpipe_handler。当程序写入一个已经关闭的管道时,内核会向进程发送一个 SIGPIPE 信号,如果进程没有捕获该信号,直接终止进程。在本程序中,当进程捕获到 SIGPIPE 信号时,会在屏幕上输出一条消息 "Caught SIGPIPE signal"。为了测试这个信号处理函数,程序还创建了一个管道,并关闭了读管道,再尝试向该管道写入数据,从而触发 SIGPIPE 信号的发送。程序执行完毕后,输出如下:

Hello world!
Caught SIGPIPE signal
写一个输出 Hello world! 并处理 SIGPIPE 信号的 C 语言程序

原文地址: https://www.cveoy.top/t/topic/Crf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录