五种网络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 进行验证