大家好,又见面了,我是你们的朋友全栈君。
#include <stdlib.h>
#include <sys/signal.h>
//默认读写一个关闭的socket会触发sigpipe信号 该信号的默认操作是关闭进程 有时候这明显是我们不想要的
//所以此时我们需要重新设置sigpipe的信号回调操作函数 比如忽略操作等 使得我们可以防止调用它的默认操作
//信号的处理是异步操作 也就是说 在这一条语句以后继续往下执行中如果碰到信号依旧会调用信号的回调处理函数
//处理sigpipe信号
void handle_for_sigpipe()
{
struct sigaction sa; //信号处理结构体
memset(&sa, '#include <stdlib.h>
#include <sys/signal.h>
//默认读写一个关闭的socket会触发sigpipe信号 该信号的默认操作是关闭进程 有时候这明显是我们不想要的
//所以此时我们需要重新设置sigpipe的信号回调操作函数 比如忽略操作等 使得我们可以防止调用它的默认操作
//信号的处理是异步操作 也就是说 在这一条语句以后继续往下执行中如果碰到信号依旧会调用信号的回调处理函数
//处理sigpipe信号
void handle_for_sigpipe()
{
struct sigaction sa; //信号处理结构体
memset(&sa, '\0', sizeof(sa));
sa.sa_handler = SIG_IGN;//设置信号的处理回调函数 这个SIG_IGN宏代表的操作就是忽略该信号
sa.sa_flags = 0;
if(sigaction(SIGPIPE, &sa, NULL))//将信号和信号的处理结构体绑定
return;
}
int main(int argc, char *argv[])
{
handle_for_sigipipe();
while(1){
}
return 0;
}
', sizeof(sa));
sa.sa_handler = SIG_IGN;//设置信号的处理回调函数 这个SIG_IGN宏代表的操作就是忽略该信号
sa.sa_flags = 0;
if(sigaction(SIGPIPE, &sa, NULL))//将信号和信号的处理结构体绑定
return;
}
int main(int argc, char *argv[])
{
handle_for_sigipipe();
while(1){
}
return 0;
}
(1)编译执行上述代码gcc -o handle_for_sigpipe handle_for_sigpipe.c
。
启动另一个Linux终端并执行killall -SIGPIPE sigpipe
,可以发现sigpipe程序的默认操作关闭进程并未执行。
(2)将main函数中的handle_for_sigpipe();
,注释后重新编译执行。
再次启动另一个Linux终端并执行killall -SIGPIPE sigpipe
,可以发现sigpipe程序退出了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139188.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...