搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Monodyee
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
个人基于腾讯云服务器安装docker、mysql、reids
2
单机java_java实现单机版五子棋小游戏
3
想要成为一名合格的软件测试工程师,你得会些啥?
4
exawear能运行java_VirSCAN.org-多引擎在线病毒扫描网 v1.02,当前支持 47 款杀毒引擎...
5
在CentOS8下安装OpenEuler,以及为OpenEuler安装GUI_openeuler gui
6
VMware虚拟机中Linux系统下安装VMware tools的方法_linux怎么安装vmware toolscsdn
7
PyTorch——实现多层感知机(附完整代码)_def train( optimizer: torch.optim.optimizer, num_e
8
正确面对“压力面试”,不要自我PUA
9
自动驾驶的三维点云处理与学习_三维点云 智能测距
10
Android Studio实现课表_安卓android实现动态课表
当前位置:
article
> 正文
linux文件设备与I/O:read/write函数 与 阻塞 Block_linux write函数是阻塞的吗
作者:Monodyee | 2024-03-31 06:11:58
赞
踩
linux write函数是阻塞的吗
一,read 函数从打开的设备或文件中读取数据
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次
read返回0
读上来的数据保存在缓冲区buf 中,同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。
二,write 函数向打开的设备或文件中写数据
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
返回值:成功返回写入的字节数,出错返回-1并设置errno
三,阻塞(Block)
当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该进程等待的事件发生了(比如网络上接收到数据包,或者调用sleep 指定的睡眠时间到了)它才有可能继续运行。
睡眠状态相对的是运行(Running)状态,在Linux内核中,处于运行状态的进程分为两种情况:正在被调度执行和就绪状态。
假设同时监视多个设备,如果read(设备1)是阻塞的,那么只要设备1没有数据到达就会一直阻塞在设备1的read 调用上,即使设备2有数据到达也不能处理,使用非阻塞I/O就可以避免设备2得不到及时处理。
在open 一个设备时指定了
O_NONBLOCK
标志,read / write 就不会阻塞。
以read 为例,如果设备暂时没有数据可读就返回-1,同时置errno 为EWOULDBLOCK(或者EAGAIN,这两个宏定义的值相同),
表示本来应该阻塞在这里(would block,虚拟语气),事实上并没有阻塞而是直接返回错误,调用者应该试着再读一次(again)。这种行为方式称为轮询(Poll),调用者只是查询一下,而不是阻塞在这里死等,这样可以同时监视多个设备。
非阻塞I/O有一个缺点,如果所有设备都一直没有数据到达,调用者需要反复查询做无用功,如果阻塞在那里,操作系统可以调度别的进程执行,就不会做无用功了。
select(2) 函数可以阻塞地同时监视多个设备,还可以设定阻塞等待的超时时间,从而圆满地解决了这个问题。
四,阻塞与非阻塞读终端实例
非阻塞读终端
程序开始执行时在0、1、2文件描述符上自动打开的文件就是终端,但是没有O_NONBLOCK 标志。所以,读标准输入是阻塞的。我们可以重新打开一遍设备文件
/dev/tty (表示当前终端)
,在打开时指O_NONBLOCK 标志。
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#define MSG_TRY "try again\n"
int main(void)
{
char buf[10];
int fd, n;
fd = open("/dev/tty", O_RDONLY|O_NONBLOCK);
if(fd<0) {
perror("open /dev/tty");
exit(1);
}
tryagain:
n = read(fd, buf, 10);
if (n < 0) {
if (errno == EAGAIN) {
sleep(1);
write(STDOUT_FILENO, MSG_TRY,
strlen(MSG_TRY));
goto tryagain;
}
perror("read /dev/tty");
exit(1);
}
write(STDOUT_FILENO, buf, n);
close(fd);
return 0;
}
阻塞读终端
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
char buf[10];
int n;
n = read(STDIN_FILENO, buf, 10);
if (n < 0) {
perror("read STDIN_FILENO");
exit(1);
}
write(STDOUT_FILENO, buf, n);
return 0;
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Monodyee/article/detail/343354
推荐阅读
article
【
Linux
&
Nginx
】
Linux
下
安装
Nginx
与
版本升级
(
nginx
-
1.24
.0)_ng...
虽然有了selinux,我们的系统会更安全,但是对于我们的学习
Nginx
的历程中,会多很多设置,所以这块建议大家将sel...
赞
踩
article
Ubuntu
Linux
18.10下面安装魔法门之
英雄无敌
3_
heroes
.of.
might
.an...
不废话,直接进入正题:1.Heroes.of.Might.
and
.Magic.3.
Linux
.[mulek.info]....
赞
踩
article
在
linux
下
运行
英雄,在
Linux
下
玩《
英雄无敌
3
》游戏...
下
面就是我要讲的主要部分,怎么对补丁进行hack。用vim打开heroes
3
-1.
3
.1-x86.run,搜索 +6 ,...
赞
踩
article
Nvidia
Tesla A100显卡
驱动
安装
下载
(
Linux
)_
nvidia
-
smi
下载
...
关于本人最近
安装
nvidia
显卡的总结和一些坑 centos71.查看
Linux
系统是否已经
安装
了
Nvidia
驱动
命令行...
赞
踩
article
ubuntu
linux
下面运行《暗黑
破坏神
2
》和
英雄无敌
3-死亡阴影_死亡阴影
linux
...
游戏文件:https://pan.baidu.com/s/114laDvxfEzpmvFEApg1yIQ#list/pa...
赞
踩
article
Ubuntu
/
Linux
安装
Android
-
sdk
和
commandlinetools
_comm...
安装 android-
sdk
-
linux
和
sdk
manager,以及配置步骤。并生成licenses _comman...
赞
踩
article
linux
dp
接口
显示,
ubuntu
dp
接口
支持...
帖子1:
ubuntu
我禁用了Nouveau 驱动以后, 页面显示正常, 我也就没用再安装n卡驱动. 怎么查看现在显卡...
赞
踩
article
linux
-
y
参数 的用处
_-
y
命令
详解...
命令
后面加上 -
y
后,当执行该
命令
后,出现 需要选择确认或取消的时候,(即选择
y
/n的时候),自动选择
y
_-
y
命令
详...
赞
踩
article
L
in
ux
常用命令
与教程_
case
$
verify
in
[yy][ee][
ss
]|[yy]) u...
全拼GlobalsearchREgularexpre
ss
ionandPr
in
toutthel
in
e.作用文本搜索工具,根...
赞
踩
article
Linux
-
ubuntu
系统查看
显卡
型号、
显卡
信息
详解
_
ubuntu
查询
显卡
信息
...
lspci | grep -i vga#----output------01:00.0 VGA compatible c...
赞
踩
article
Linux
(
Ubuntu
)系统
查看
显卡
型号
_
linux
查看
机器
显卡
id...
Linux
(
Ubuntu
)系统
查看
显卡
型号
给我的
Ubuntu
安装
显卡
驱动时,需要
查看
显卡
型号
,因为我的是Windows/...
赞
踩
article
LINUX
设置LL
的
时候
显示
日期
的
格式
_
ll
不
显示
时间
...
1、临时更改
显示
样式,当回话结束后恢复原来
的
样式export TIME
_
STYLE='+%Y-%m-%d %H:%M:%...
赞
踩
article
Android
与其他
基于
Linux
的
系统
有何不同?_
android
credstore
...
文章目录一言以蔽之原文:https://embeddedbits.org/what-differs-
android
-fr...
赞
踩
article
Linux
(
Ubuntu
)下适配
Open3D
_ML库的
CUDA
环境配置_
open3d
的
linux
版本...
本文针对
Linux
不同版本内核切换、适配
CUDA
的NVIDIA显卡驱动安装、
CUDA
-cudnn-Pytorch下载安装...
赞
踩
article
相爱相杀
的
CP——初谈
Android
Kernel
与
Linux
Kernel
_
linux
kern...
当
Linux
社区决定将安卓踢出
Linux
Kernel
时,他注定犯下了一个大错。本是同根生,相煎何太急。这次我们来简单聊...
赞
踩
article
【
Android
系列
1.0
驱动
开发 ---
Linux
驱动
内核
】_android
1.0
驱动
...
参考文档Context当探索Binder机制,引出很多
Linux
相关概念。说Binder是
驱动
程序,Binder用了内存...
赞
踩
article
Lin
u
x
下
检测
是否插入U
盘
_
lin
u
x
如何
检测
u
盘
...
Lin
u
x
下
检测
是否插入U
盘
LIn
u
x根目录
下
主要常见的目录定义:/boot 开机所需文件–内核、开机菜单所需配置...
赞
踩
article
lin
u
x
下
检测
U盘
插入
并读取文件
_
imx6
u
ll
lin
u
x
u
盘
插入
检测
...
建立NET
_
LINK套接字,与内核通信实时
检测
U状态(与基本的套接字编程基本一致) #incl
u
de #incl
u
de ...
赞
踩
article
Linux
USB
设备热插拔检测...
原文链接#include
#include
#include
[详细]
-->
赞
踩
article
lin
u
x 查看
u
盘
文件
,详细介绍
Lin
u
x
系统
下检测U
盘
是不是已经连接的方法...
Lin
u
x
操作
系统
是基于Unix操作
系统
发展而来的一种克隆
系统
,它诞生于1991年的10月5日(这是第一次正式向外公布的...
赞
踩
相关标签
linux
nginx
python
运维
安全
网络安全
网络
在linux下运行英雄
centos
android
ubuntu
linux dp接口显示
bash
总结
Linux(Ubuntu)
CUDA
cudnn
pytorch
Open3D_ML