五种网络IO
阻塞IO
非阻塞IO
多路IO复用
异步IO
信号驱动IO
信号驱动IO -- 通过信号的方式来触发 信号处理函数执行相应的逻辑功能,类似于异步的一个过程
编写代码
进行信号驱动IO的调试和确认: 写一个udp的demo
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>
#include <netinet/in.h>
int sockfd;
//信号处理函数
void sig_func(int arg)
{
printf("the signal is %d\n",arg);
char buff[256]={0};
int ret = read(sockfd,buff,sizeof(buff));
printf("read buff == %s , len = %d\n",buff,ret);
write(sockfd,buff,ret);
}
int main(int agrc,char * argv[])
{
//建立udp的套接字
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket");
return -1;
}
//初始化信号处理函数
struct sigaction mysig;
mysig.sa_handler = sig_func;
mysig.sa_flags = 0;
sigaction(SIGIO,&mysig,NULL);
//绑定端口信息
struct sockaddr_in addr;
memset(&addr,0,sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(9999);
addr.sin_addr.s_addr = INADDR_ANY;
//设置属性,将fd加入到本进程
fcntl(sockfd,F_SETOWN,getpid());
//设置同步 非阻塞状态
int flag = fcntl(sockfd,F_GETFL,0);
flag = O_ASYNC | O_NONBLOCK;
fcntl(sockfd,F_SETFL,flag);
//bind
int ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr));
if(ret < 0)
{
perror("bind");
return -2;
}
while(1) sleep(1);
close(sockfd);
return 0;
}
编译
gcc -o mysig mysig.c
验证
使用工具NetAssist_v4.3.25.exe 进行验证