zoukankan      html  css  js  c++  java
  • fcntl()函数之非阻塞模型

    优点:设置标准输入为非阻塞(有数据则读 没有数据则立即返回),常用于网络通信以及轻量信息多并发中

    步骤:

    1.oldflag=fcntl(STDIN_FILENO,F_GETFL);

      获取标准输入的文件打开标志。

    2.fcntl(STDIN_FILENO,F_SETFL,oldflag|O_NONBLOCK)

      将该标志加入O_NONBLOCK非阻塞标志

    3.编写函数逻辑,以及要处理问题。

    4.代码如下

    //非阻塞模型
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>

    int main(void)
    {
    char *t,buf[4096];

    //设置标准输入为非阻塞(有数据则读 没有数据则立即返回)
    int ret,oldflag;
    oldflag=fcntl(STDIN_FILENO,F_GETFL);
    if(oldflag==-1) return 1;//error!!!
    if(fcntl(STDIN_FILENO,F_SETFL,oldflag|O_NONBLOCK)==-1)
    {
    perror("set no block ");
    return 2;
    }

    while(1)
    {
    t=fgets(buf,4096,stdin);//getchar scanf read ==>stdin
    if(t==NULL){
    printf("非阻塞返回. ");
    }else{
    printf("buf>>>%s ",buf);
    }

    printf("do other. ");
    usleep(500000);//0.5s
    }

    return 0;
    }

    ////////////////////////////////////////////////////////利用阻塞错误、、、、、、、、、、、、、、

    //非阻塞模型
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>//使用errno错误标记变量

    int main(void)
    {
    char buf[4096+1];

    //设置标准输入为非阻塞(有数据则读 没有数据则立即返回)
    int ret,oldflag;
    oldflag=fcntl(STDIN_FILENO,F_GETFL);
    if(oldflag==-1) return 1;//error!!!
    if(fcntl(STDIN_FILENO,F_SETFL,oldflag|O_NONBLOCK)==-1)
    {
    perror("set no block ");
    return 2;
    }

    while(1)
    {
    ret=read(STDIN_FILENO,buf,4096);
    if(ret==-1){//error
    if(errno==EAGAIN)//非阻塞
    {
    printf("我要的非阻塞. ");
    }
    else
    {
    perror("read from stdin error");
    return 3;
    }
    }else{
    printf("buf>>>%s ",buf);
    }

    printf("do other. ");
    usleep(500000);//0.5s
    }

    return 0;
    }

  • 相关阅读:
    ipv6现状,加英文的中括号访问, ipv6测试http://test-ipv6.com
    从30岁至35岁:为你的生命多积累一些厚度
    delete
    国内投行的工资
    南京大学行业求职研究报告——投资银行篇
    【oracle案件】ORA-19502,ORA-27072
    多线程第四篇秒杀 一个经典的多线程同步问题
    霍夫的图像处理变换(线检测算法)
    hadoop-ha组态
    央视公然诽谤Linux操作系统,谁报告?
  • 原文地址:https://www.cnblogs.com/edan/p/8833585.html
Copyright © 2011-2022 走看看