写一个输出 Hello world! 并处理 SIGPIPE 信号的 C 语言程序
#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
原文地址: https://www.cveoy.top/t/topic/Crf 著作权归作者所有。请勿转载和采集!