system programming 第四讲 高级io 阻塞/非阻塞

阻塞 非阻塞IO

#include "head.h"

int make_nonblock(int fd) {
    int flag;
    if ((flag = fcntl(fd, F_GETFL)) < 0) {
        return -1;
    }
    flag |= O_NONBLOCK;
    if ((fcntl(fd, F_SETFL, flag)) < 0) {
        return -1;
    }
    return 0;
}

int make_block(int fd) {
    int flag;
    if ((flag = fcntl(fd, F_GETFL)) < 0) {
        return -1;
    }
    flag &= ~O_NONBLOCK;
    if (fcntl(fd, F_SETFL, flag) < 0) {
        return -1;
    }
    return 0;
}

#include "head.h"
int main(){
    int num = 10;
    int num1 = 12;
    int temp;
    if((temp = make_nonblock(0)) < 0){
        perror("make_nonblock");
        exit(1);
    }
    scanf("%d", &num);
    if((temp = make_block(0)) < 0){
        perror("make_block");
        exit(1);
    }
    scanf("%d", &num1);
    printf("num = %d\n", num);
    printf("num = %d\n", num1);
    return 0;
}

select

#include"head.h"

int main(){
    
    int temp;
    int num = 10;
    if((temp = make_nonblock(0)) < 0){
        perror("make_nonblock");
        exit(1);
    }
    sleep(10);
    scanf("%d", &num);
    printf("num = %d\n", num);

    return 0;
}

#include "head.h"
int main(){
    //先清空集合
    //把要监控的fd,添加到集合里
    //select 监控,设定时间
    //操作文件描述符

    int num = 10;
    fd_set rdfds;
    FD_ZERO(&rdfds);
    FD_SET(0, &rdfds);
    struct timeval tv;
    tv.tv_sec = 10;
    tv.tv_usec = 0;
    int temp = select(1, &rdfds, NULL, NULL, &tv);
    if (temp < 0){
        perror("select");
        exit(1);
    }
    if(temp > 0){
        scanf("%d", &num);
    }else{
        fprintf(stderr, "timeout\n");
    }
    printf("num = %d time = %ld\n", num, tv.tv_sec);


    return 0;
}

请添加图片描述

这里看不出来,但是实际演示的时候,select得到想要的输出之后不需要等待,而nonblock需要等过完了10秒才运行结束。

poll

#include "head.h"
#define TIMEOUT 5
int main(){
    //文件描述符结构体数组
    //确定检测的个数
    //设置events
    //实现poll
    int num = 10;
    struct pollfd fds[1];
    int nfds = 1;
    fds[0].fd = 0;
    fds[0].events = POLLIN;
    int temp = poll(fds, nfds, 1000 * TIMEOUT);
    if (temp < 0){
        perror("poll");
        exit(1);
    }
    if(fds[0].revents & POLLIN){
        scanf("%d", &num);
    }
    if (!temp){
        fprintf(stderr, "time = %d\n", TIMEOUT);
    }
    if(fds[0].revents & POLLIN){
        scanf("%d", &num);
    }
    printf("num = %d\n", num);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值