Linux&C语言简单使用select实现IO多路复用--网络编程

该博客介绍了如何利用select系统调用实现IO多路复用,通过有名管道(fifo)实现在多个进程中进行多次读写操作,避免了读写阻塞的问题。示例代码包括创建有名管道、读端进程的select实现以及多个写端进程。通过这种方式,可以提高进程间通信的效率和灵活性。
摘要由CSDN通过智能技术生成

使用select实现IO多路复用

用父子进程—实现进程间可以多次输入读取

使用select实现IO多路复用,就可以读取同一进程多次输入,不受读取其他进程时,read的阻塞,读取只阻塞在select

代码实现

1.创建有名管道mkfifo fifo1 fifo2 fifo3

2. read.c —3进程写入

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
/*select*/
#include <sys/select.h>
/*exit*/
#include <stdlib.h>

int main(){
    //1.创建文件mkfifo fifo1 fifo2 fifo3
    //2.打开文件
    int fd1 = open("fifo1", O_RDONLY);
    int fd2 = open("fifo2", O_RDONLY);
    int fd3 = open("fifo3", O_RDONLY);

    char buff1[32] = {0};
    char buff2[32] = {0};
    char buff3[32] = {0};
    //1.创建文件描述符集合
    fd_set readfds;
    FD_ZERO(&readfds);//清空集合
    fd_set readfds_temp;用来备份原集合的
    FD_ZERO(&readfds_temp);//清空集合

    //2.记录表中最大的文件描述符
    int max_fd = 0;
    //3.将fd添加到集合中
    FD_SET(fd1,&readfds);
    max_fd=(max_fd>fd1?max_fd:fd1);//找最大的文件描述符
    FD_SET(fd2,&readfds);
    max_fd=(max_fd>fd2?max_fd:fd2);//
    FD_SET(fd3,&readfds);
    max_fd=(max_fd>fd3?max_fd:fd3);//

    while(1){
        //select会将没有就绪的文件描述符擦除
        readfds_temp=readfds;
        //4.select找就绪的文件描述符
        //成功 返回就绪的文件描述符的个数
        if (-1==(select(max_fd+1,&readfds_temp,NULL,NULL,NULL)))
        {
            perror("select error");
            exit(-1);
        }
        if(FD_ISSET(fd1, &readfds_temp))
        {
            memset(buff1, 0, 32);
            read(fd1, buff1, 32);
            printf("buff1 = %s\n", buff1);
        }
        if(FD_ISSET(fd2, &readfds_temp))
        {
            memset(buff2, 0, 32);
            read(fd2, buff2, 32);
            printf("buff2 = %s\n", buff2);
        }
        if(FD_ISSET(fd3, &readfds_temp))
        {
            memset(buff3, 0, 32);
            read(fd3, buff3, 32);
            printf("buff3 = %s\n", buff3);
        }
    }

    close(fd1);
    close(fd2);
    close(fd3);

    return 0;
}

3.01write.c 02write.c 03write.c

3个写端,只需修改打开的管道文件描述符

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{                //修改这fifo1/fifo2/fifo3
    int fd = open("fifo1", O_WRONLY);
    char buff[32] = {0};
    while (1)
    {
        fgets(buff, 32, stdin);
        buff[strlen(buff) - 1] = '\0';
        write(fd, buff, 32);
    }
    close(fd);
    return 0;
}

执行结果

在这里插入图片描述

6.非原创

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值