linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响

1.基本概念

所谓的阻塞,即内核在对文件操作I/O系统调用时,如果条件不满足(可能需要产生I/O),则内核会将该进程挂起。非阻塞则是发现条件不满足就会立即返回。此外需要注意的是非阻塞并不是轮询,不然就和阻塞没多大区别了,它只是调用不成功就直接返回了,不会在去看啥时候会满足条件,而是有你自己去选择接下来该咋办,系统以不再负责

2.read/write阻塞与非阻塞的理解

read/write系统调用,并不会去直接读写文件,而只是去操作文件所对应的内存页(此时的页为虚拟内存),对于read如果在页中找到了想要读写的数据,则直接从页中将数据copy到用户缓存即可,如果要读的页没有找到,则只能从磁盘读出该页内容缓存在内存中即可。所谓的读过程,其实文件系统所要做的只是锁定页面,然后构造一个读请求,并将请求发给底层的IO子系统即可。linux内核中read系统调用默认是阻塞的write调用是非阻塞的,因为write时只是将用户态的数据写入缓存页面中即可返回

3.对于网络套接字阻塞/非阻塞对读数据的影响

(1)在阻塞情况下

在阻塞条件下,read/recv/msgrcv的行为

1.如果没有发现数据在网络缓冲中会一直等

2.当发现有数据时会把数据读到用户指定的缓存区中(如果读到的数据比指定的大小小,read此时并不会阻塞,而是会立即返回)

应为read的原则是在不超过指定长度的时候有多少读多少,没有数据就返回。所以一般情况下,如果我们想要读取我们想要的字节量,就得循环read

(2)在非阻塞情况下

在非阻塞情况下read的行为

1.如果发现没有数据就直接返回

2.如果发现有数据,那么也是采用有多少就读多少,所以read完之后需要判断是否再次进行read操作,以读到我们想要的字节数

对于读的阻塞与非阻塞区别就在于没有数据可读时,是否立即返回

4.对于网络套接字阻塞/非阻塞对写数据的影响

写的操作本质也不是进行发送操作,而是把用户态的数据copy到系统底层去,然后由系统帮忙发送。send,write返回成功,只表明数据已经copy到底层缓冲,而并不表明数据以发送出去,更不能表示对方端口已经接收到数据

(1)阻塞情况下

write会将数据发完之后才返回,这里与读不同。当我们读数据的时候,我们并不知道发送端是否还有数据要发,如果一直等待就可能造成死循环,所以为了避免这类事情发生,我们把当前缓存中的内容读完,就返回了,并不关心是否读够了我们想要读的字节数。而write,由于需要写的长度是知道的,所以它会一直写够指定的字节才返回

(2)非阻塞情况下

非阻塞情况下,是采用可以写多少就写多少的策略,与读不一样的地方在于,有多少读多少是由网络发送端是否有数据传输到为标准。但是对于写多少是由本地网络堵塞情况为标准的,对于非阻塞的情况就是一次写多少算多少,有可能会造成部分写入

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

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

相关文章

C++文件类

C 标准类库中有三个类可以用于文件操作,它们统称为文件流类。这三个类是: ifstream:用于从文件中读取数据。ofstream:用于向文件中写人数据。fstream:既可用于从文件中读取数据,又可用于 向文件中写人数据。…

window10内核Linux,windows 10中发布完整的Linux内核

5月8日消息: 近年来,微软对Linux开发者社区的支持令许多人感到惊讶,包括将诸如Bash shell之类的东西引入到Windows,或者在Windows 10中支持原生OpenSSH,甚至包括Windows应用商店上架了Ubuntu、SUSE Linux和Fedora。现在…

C++ open 打开文件

在对文件进行读写操作之前,先要打开文件。打开文件有以下两个目的: 1 . 通过指定文件名,建立起文件和文件流对象的关联,以后要对文件进行操作时,就可以通过与之关联的流对象来进行。 2 . 指明文件的使用方式。使用方…

c语言窗口炸弹代码,C语言实现数字炸弹小游戏

本文实例为大家分享了C语言实现数字炸弹小游戏的具体代码,供大家参考,具体内容如下使用的是C语言# 内容#include#includeint main(){//变量char c_TheRequest 1;//开始界面的字符int in_Deltar 1,in_EnteredNumber,in_Sig;//游戏中输入数字及其判定所需…

C++ 文本文件的读取和写入

使用文件流对象打开文件后,文件就成为一个输入流或输出流。对于文本文件,可以使用 cin、cout 读写。 流的成员函数和流操纵算子同样适用于文件流,因为 ifstream 是 istream 的派生类,ofstream 是 ostream 的派生类,fs…

C++ 移动和获取文件读写指针

在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。 ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置;ofstream 类和 fstream 类有 seekp…

程序设计基础——c语言篇,C语言程序设计基础篇.ppt

C语言程序设计基础篇C 语言程序设计—基础篇 第 2 章 数据类型和输入输出 2.1 数据类型 著名计算机科学家沃思提出: 程序=数据结构+算法 例如:学生各科成绩及总分排队问题。 成绩存放 –– 数据结构 排队方法 –– 算法 在此, 存放…

文件的文本打开方式和二进制打开方式的区别

在 UNIX/Linux 平台中,用文本方式或二进制方式打开文件没有任何区别。 在 UNIX/Linux 平台中,文本文件以\n(ASCII 码为 0x0a)作为换行符号;而在 Windows 平台中,文本文件以连在一起的\r\n(\r的…

c语言scanf函数隐藏的缓冲区,零基础学C语言 笔记四 Scanf函数清除缓冲区

Scanf函数清除缓冲区之前涉及到scanf会先到缓冲区看看是否存在数据,若存在数据,就直接拿缓冲区的数据过来使用,这就涉及到了一个问题,那如果缓冲区的数据不是我想要的呢?方法一:我们用scanf吸收掉我们的代码…

c语言中exchange函数,exchange

exchange描述 (Description)它原子地替换原子对象的值并获得先前保存的值。声明 (Declaration)以下是std :: atomic :: exchange的声明。T exchange( T desired, std::memory_order order std::memory_order_seq_cst );C11T exchange( T desired, std::memory_order order st…

C++ 流类和流对象

程序中常用的 cin 和 cout,分别用于从键盘输入数据和向屏幕输出数据(简称为标准 I/O)。除此之外,程序还可以从文件中读入数据,以及向文件中写入数据(简称为文件 I/O)。 数据输入和输出的过程也是数据传输的…

c语言float判断相等,c/c++ 比较两个浮点数相等

首先&#xff0c;两个 if 是一样的。浮点数和整数比较时&#xff0c;整数被转为浮点数。然后&#xff0c;i 为什么不等于 10.0&#xff1f;因为它只会等于这些值&#xff1a;>>> def gen():... i 0... while i < 10:... i 0.1... yield i...>>> L list…

C++ cout格式化输出

希望按照一定的格式进行输出&#xff0c;如按十六进制输出整数&#xff0c;输出浮点数时保留小数点后面两位&#xff0c;输出整数时按 6 个数字的宽度输出&#xff0c;宽度不足时左边补 0&#xff0c;等等。C 中的 cout 对象则使用流操作算子&#xff08;你也可以叫做格式控制符…

C语言按各科分数段统计人数,(更新啦)学校学生成绩统计通用模板(科目、分数、统计分数段等均可自定,班级数、学生人数不受限制)...

更新说明&#xff1a;1、增加了导入、导出数据功能。2、该功能可以实现版本更新时不用手动复制数据&#xff0c;可实现一键导入导出。导语微信号☞gdpc-service这是一款适用于学校平时统一考试成绩统计表。这是长期根据学校的需求设计出的成绩统计&#xff0c;学生成绩清晰明了…

C++ 输出单个字符

在 C 程序中一般用 cout 和输出运算符 << 实现输出&#xff0c;cout 流在内存中有相应的缓冲区。但有时用户还有特殊的输出需求&#xff0c;例如只输出一个字符。 ostream 类除了提供上一节介绍过的用于格式控制的成员函数外&#xff0c;还提供了专门用于输出单个字符的…

ndows10同时打印多份文档,Windows10如何同时重命名多个文件

在Win10系统中整理重要文件时&#xff0c;很多用户都会对文件进行重命名&#xff0c;以便节省更多的时间。而如果文件数量非常多的话&#xff0c;我们就需要对其进行批量重命名。那么&#xff0c;这该如何操作呢&#xff1f;今天&#xff0c;小编就给大家分享一下Win10系统同时…

C++ 读取结束的判断

cin 可以用来从键盘输入数据&#xff1b;将标准输入重定向为文件后&#xff0c;cin 也可以用来从文件中读入数据。在输入数据的多少不确定&#xff0c;且没有结束标志的情况下&#xff0c;该如何判断输入数据已经读完了呢&#xff1f; 从文件中读取数据很好办&#xff0c;到达…

c语言指针算法分析怎么写,什么叫指针算法啊??

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Pointer arithmetic should not be used.This rule refers to explicitly calculating pointer values. Any such pointer value then has thepotential to access unintended or invalid memory addresses. This is an area where…

C++ 读取单个字符

get() 是 istream 类的成员函数。 int get();此函数从输入流中读入一个字符&#xff0c;返回值就是该字符的 ASCII 码。如果碰到输入的末尾&#xff0c;则返回值为 EOF。 EOF 是 End of File 的缩写。istream 类中从输入流&#xff08;包括文件&#xff09;中读取数据的成员函…

C++ 读入一行字符串

getline() 是 istream 类的成员函数&#xff0c;它有如下两个重载版本&#xff1a; istream & getline(char* buf, int bufSize); istream & getline(char* buf, int bufSize, char delim);第一个版本从输入流中读取 bufSize-1 个字符到缓冲区 buf&#xff0c;或遇到\…