网络IO 之 信号驱动型io

本文探讨了网络IO的五种类型,重点介绍了信号驱动IO的工作原理,它利用信号来触发信号处理函数执行逻辑。文章通过编写一个UDP的示例代码并进行编译,展示了如何设置和调试信号驱动IO,并建议使用NetAssist_v4.3.25.exe工具进行功能验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值