当前位置: 技术问答>linux和unix
关于模拟socket中SIGPIPE信号的问题
来源: 互联网 发布时间:2017-05-02
本文导语: 我在论坛上看到以下两段话: “在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。 在Unix系统下,如果recv函数在等待协议接收...
我在论坛上看到以下两段话:
“在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。”
1,不过不是很理解,主要是对于“协议传送数据时”和“协议接收数据时”不知道是什么时候?又该如何模拟呢?
2,还有我想分别模拟send和recv产生SIGPIPE,模拟send函数产生SIGPIPE还是很简单的,就对关闭的socket发送两次send,就会产生SIGPIPE,但是如何模拟recv函数产生SIGPIPE呢?
“在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。”
1,不过不是很理解,主要是对于“协议传送数据时”和“协议接收数据时”不知道是什么时候?又该如何模拟呢?
2,还有我想分别模拟send和recv产生SIGPIPE,模拟send函数产生SIGPIPE还是很简单的,就对关闭的socket发送两次send,就会产生SIGPIPE,但是如何模拟recv函数产生SIGPIPE呢?
#include
#include
#include
#include
#include
#include
#include
#include
typedef void (*sighandler_t)(int);
void sig_pipe(int signo)
{
printf("捕获到SIGPIPE信号!n");
}
int main()
{
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = htons(INADDR_ANY);
client_addr.sin_port = htons(0);
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if( client_socket