fcntl函数 非阻塞轮询

news2024/11/25 7:09:33

 

fcntl() 在打开的文件描述符 FD 上执行下面描述的操作之一。 操作由 cmd 确定。

fcntl() 可以采用可选的第三个参数。 是否需要此参数由 cmd 确定。 所需的参数类型在后面的括号中指示。


每个cmd名称(在大多数情况下,所需的类型是int,我们使用名称arg来标识参数),或者如果不需要参数,则指定void。

下图是对是否需要设置可变参数的解释:

 

#include <iostream>

#include <cstdlib>

#include <unistd.h>

#include <fcntl.h>

#include <stdio.h>

#include <cstring>

#include <cerrno>

void SetNonBlock(int fd)

{

    // 提取文件描述符属性(返回值是一个位图)

    int f1 = fcntl(0, F_GETFL);

    if (f1 < 0)

    {

        perror("fcntl");

        return;

    }



    // 使用F_SETFL将文件描述符设置回去,加上O_NONBLOCK参数。

    fcntl(0, F_SETFL, f1 | O_NONBLOCK);

}



int main()

{



    char buffer[1024];

    SetNonBlock(0); // 设置非阻塞。

    while (true)//轮询

    {

        sleep(1);

        printf(">>> ");

        fflush(stdout);

        ssize_t n = read(0, buffer, sizeof(buffer) - 1); // (检查条件是否就绪)等+拷贝



        if (n > 0)

        {

            buffer[n - 1] = 0; // 因为从标准输入读取,回车键也会放入内核缓冲区,被上层读取。

            std::cout << "echo# " << buffer << std::endl;

        }

        else if (n == 0)

        {

            std::cout << "end file" << std::endl;

        }

        else

        {

            // 区分是真正出错还是数据没有就绪这两种情况。

            if (errno == EAGAIN || errno == EWOULDBLOCK)

            {

                // 底层数据没有就绪,希望你下次继续来检测

                std::cout<<"data not ready"<<std::endl;

                continue;

            }



            else if (errno == EINTR)

            {

                // 这次I/O被信号中断,也需要重新读取

                continue;

            }

            else

            {

                //真正出错

                std::cout << "WARNING!!!  ERRNO: " << errno << ",error: " << strerror(errno) << std::endl;

                break;

            }

        }

    }



    return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公众号迁移是什么?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不…

博弈论——劳资博弈

劳资博弈 0 引言 前一篇文章介绍了静态博弈中常见的几个案例以及场景&#xff0c;并且在此之前也还介绍过斯塔克尔伯格博弈等动态博弈&#xff0c;以及相关的解决方法——反应函数法。今天我们继续介绍一个常见的动态博弈——劳资博弈&#xff0c;并利用反应函数解决&#xff…

视觉人机器视觉线下培训遵循十大原则

1.​上课期间&#xff0c;自习时间没收手机&#xff0c;偷偷使用手机&#xff0c;将会被通报严重批评。 2.完善的教学设备&#xff0c;与具备现场落地设备要求。 3.教学与实操结合&#xff0c;老师教学的同时&#xff0c;要求你按照老师的效果&#xff0c;进行复现&#xff0…

黑马程序员RabbitMQ入门到实战教程【基础篇】学习笔记

目录 一、初始MQ 1.1、同步调用 1.2、异步调用 1.3、MQ技术选型 二、RabbitMQ 2.1、安装 2.2、收发消息 2.2.1、交换机 2.2.2、队列 2.2.3、绑定关系 2.2.4、发送消息 2.3、数据隔离 2.3.1、用户管理 2.3.2、virtual host 三、SpringAMQP 3.1、导入Demo工程 3…

【中国知名企业高管团队】系列23:金山软件KINGSOFT

今天是2023年10月1日&#xff0c;第74个国庆节&#xff0c;华研荟祝各位小伙伴节日快乐&#xff01;阖家幸福&#xff01; 这个特别的日子里&#xff0c;我们来了解金山软件的高管团队。 说到金山软件&#xff0c;可能很多非IT圈的人或者年轻的朋友们不一定知道&#xff0c;但…

【LeetCode热题100】--101.对称二叉树

101.对称二叉树 使用递归&#xff1a; 实现一个递归函数&#xff0c;通过同步移动两个指针的方法来遍历这颗树&#xff0c;p 指针和 q 指针一开始都指向这棵树的根&#xff0c;随后 p 右移时&#xff0c;q左移&#xff0c;ppp 左移时&#xff0c;q 右移。每次检查当前 p 和 q节…

【STM32 LVGL基础教程】初识LVGL

文章目录 前言一、什么是LVGL&#xff1f;二、LVGL的诞生历程三、LVGL的用途四、模拟器使用LVGL4.1 下载codeblocks并运行模拟器lvgl4.2 更改lvgl设置更改帧数更改颜色深度 五、STM32使用LVGL总结 前言 嵌入式系统中的图形用户界面&#xff08;GUI&#xff09;已经成为现代设备…

小说推文和短剧推广以及电影达人带货电影票

小说推文、短剧推广、电影达人&#xff08;带或电影票&#xff09;都可以通过“巨量推文“进行申请授权 小说推文和短剧推广是什么&#xff1f; 小说推文和短剧推广的逻辑其实一样&#xff0c;分为cpa拉新和cps分成的推广形式 cpa拉新是你推广的用户必须为新用户&#xff0c…

【 SuperPoint 】图像特征提取上的对比实验

1. SIFT&#xff0c;SuperPoint 都具有提取图片特征点&#xff0c;并且输出特征描述子的特性&#xff0c;本篇文章从特征点的提取数量&#xff0c;特征点的正确匹配数量来探索一下二者的优劣。 SuperPoint提取到的特征点数量要少一些&#xff0c;可以理解&#xff0c;我想原因大…

mac如何卸载应用并删除文件,2023年最新妙招大公开!

大家好&#xff0c;今天小编要为大家分享一些关于mac电脑的小技巧&#xff0c;特别是关于如何正确卸载应用程序以及清理卸载后的残留文件。你知道吗&#xff1f;很多人都不知道&#xff0c;mac系统默认的卸载方式可能会导致一些残留文件滞留在你的电脑上&#xff0c;慢慢地占用…

算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

1.区间问题 905.区间选点 给定N个闭区间[ai, bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量&#xff0c;位于区间端点上的点也算作是区间内。 将每个按区间的右端点从小到大排序 从前往后依次枚举每…

VS Code 如何搭建 C/C++开发环境

目录 VScode是什么? VScode的下载和安装? 2.1 下载和安装 安装&#xff1a; 2.2 环境的介绍 环境介绍&#xff1a;​编辑 安装中文插件&#xff1a; VScode配置 C/C 开发环境 3.1 下载和配置MinGW-w64 编译器套件 下载&#xff1a; 配置MinGW64&#xff1a; 3.2 安…

排序篇(六)----排序小结

排序篇(六)----排序小结 排序算法复杂度及稳定性分析 直接插入排序的算法复杂度&#xff1a; 最好情况下&#xff0c;当数组已经有序时&#xff0c;直接插入排序的时间复杂度为O(n)&#xff0c;其中n是数组的大小。最坏情况下&#xff0c;当数组逆序排列时&#xff0c;直接插…

【python海洋专题二】读取水深nc文件并水深地形图

【python海洋专题二】读取水深nc文件并水深地形图 海洋与大气科学 导入函数包 from netCDF4 import Dataset import numpy as np import matplotlib.pyplot as plt 前两个上期更新说明了&#xff1a;第一个读取nc文件&#xff0c;第二个用于计算。 matplotlib.pyplot&#xf…

Audacity 使用教程:轻松录制、编辑音频

Audacity 使用教程&#xff1a;轻松录制、编辑音频 1. 简介 Audacity 是一款免费、开源且功能强大的音频录制和编辑软件。它适用于 Windows、Mac 和 Linux 等多种操作系统&#xff0c;适合音乐制作、广播后期制作以及普通用户进行音频处理。本教程将带领大家熟悉 Audacity 的…

Linux 基本语句_4_指针和函数

指针函数 顾名思义&#xff0c;即返回值为指针的函数 int * f (int n){int *p NULL;//空指针return p;//返回一个地址 }函数指针 指向函数的指针&#xff0c;每个函数都有自己的入口地址&#xff0c;函数指针专门指向这些地址#include <stdio.h>int max(int a, int b)…

【LeetCode热题100】--226.翻转二叉树

226.翻转二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

10.1 File类

前言&#xff1a; java.io包中的File类是唯一一个可以代表磁盘文件的对象&#xff0c;它定义了一些用于操作文件的方法。通过调用File类提供的各种方法&#xff0c;可以创建、删除或者重命名文件&#xff0c;判断硬盘上某个文件是否存在&#xff0c;查询文件最后修改时间&…

HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题

目录 一、GET与POST简介 二、空行和body 三、初识请求报头以及粘包问题 四、认识请求报头剩余部分 一、GET与POST简介 GET https://www.sogou.com/HTTP/1.1 请求报文中的方法&#xff0c;是最常规的方法&#xff08;获取资源&#xff09; POST&#xff1a;传输实体主体的方法…

MACH架构的质量工程指南

MACH是快速创建高质量应用的最佳实践&#xff0c;同时也意味着有助于团队内的质量工程。本文介绍了MACH在质量工程领域所起的作用&#xff0c;并介绍了成功的MACH架构必备的8个要素。原文: MACH Architecture: The Quality Engineering Guide MACH和质量工程有关。 在过去几年里…