Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从stdin读取()

从stdin读取()
EN

Stack Overflow用户
提问于 2012-01-23 17:03:02
回答 5查看 62.2K关注 0票数 17

考虑下面这行代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while((n = read(STDIN_FILENO, buff, BUFSIZ)) > 0)

根据我的理解,read/write函数是非缓冲I/O的一部分。那么,这是否意味着read()函数将在每次调用时只从stdio读取一个字符?或者换句话说,n的值将是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    -1  in case of error
n =  0  in case of EOF
     1  otherwise

如果不是,那么上述read()函数将在什么时候返回?为什么?

注意:我还认为read()将等待,直到它成功地从标准输入中读取BUFSIZ数量的字符。但是,如果可供读取的字符数少于BUFSIZ,会发生什么情况呢?read是永远等待还是等到EOF到来( unix上的Ctrl + D或windows上的Ctrl + Z )?

另外,假设是BUFSIZ = 100stdin = ACtrl+D (即紧跟在单个字符后面的EOF )。现在,while loop将迭代多少次?

EN

回答 5

Stack Overflow用户

发布于 2012-01-23 17:16:50

read()的行为方式取决于所读取的内容。对于常规文件,如果请求N个字符,则得到N个字符(如果可用),如果文件末尾介入,则得到少于N个字符。

如果read()在规范/熟食模式下从终端读取数据,tty驱动程序会一次提供一行数据。因此,如果您告诉read()获取3个字符或300个字符,那么read将挂起,直到tty驱动程序看到换行符或终端定义的EOF键,然后read()将返回该行中的字符数或您请求的字符数,取较小的值。

如果read()在非规范/原始模式下从终端读取,那么read将立即访问按键。如果您要求read()获取3个字符,它可能会返回0到3个字符,这取决于输入时间和终端的配置方式。

在遇到信号时,read()的行为会有所不同,返回的字符数少于请求的字符数,或者如果在任何字符到达之前信号中断了读取,则返回-1并将errno设置为EINTR。

如果描述符已配置为非阻塞I/O,则read()的行为将有所不同。如果没有立即可用的输入,read()将返回-1并将errno设置为EAGAIN或EWOULDBLOCK。这适用于套接字。

因此,正如您所看到的,当您调用read()时,应该准备好迎接惊喜。您不会总是得到所请求的字符数,并且可能会得到像EINTR这样的非致命错误,这意味着您应该重试read()。

票数 21
EN

Stack Overflow用户

发布于 2012-01-23 17:19:06

您的代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while((n = read(0, buff, BUFSIZ) != 0))

这是有缺陷的-括号意味着它被解释为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while ((n = (read(0, buff, BUFSIZ) != 0)) != 0)

其中,布尔条件在赋值之前求值,因此n将仅获得值0(条件不为真)和1(条件为真)。

你应该这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while ((n = read(0, buff, BUFSIZ)) > 0)

这会在出现EOF或读取错误时停止,n会让您知道遇到了哪种情况。

显然,上面的代码是问题中的一个打字错误。

无缓冲I/O读取的字符数将达到您读取的字符数(但不会更多)。它可能会因为EOF或错误而读取较少。它也可能读取较少的内容,因为在调用时有较少的内容可用。以终端为例;通常,它只能读到行尾,因为没有比行尾更多的数据可用。考虑一个管道;如果供给进程生成了128个未读字节,那么如果BUFSIZ是4096,那么从读取中只能获得128个字节。非阻塞文件描述符可能会因为没有可用的东西而返回;套接字可能会返回更少的字节,因为还没有更多的信息可用;磁盘读取可能会返回更少的字节,因为在执行读取时,文件中剩余的字节数少于请求的字节数。

不过,通常情况下,如果您请求很多字节,read()不会只返回一个字节。

票数 4
EN

Stack Overflow用户

发布于 2012-01-23 17:06:53

正如read()手册页所述:

返回值

如果成功,将返回读取的字节数(0表示文件结束),文件位置将按此数字前进。如果这个数字小于请求的字节数,这不是错误;例如,这可能是因为现在实际可用的字节更少了(可能是因为我们接近文件末尾,或者因为我们正在从管道或终端读取数据),或者因为read()被信号中断。出错时,返回-1,并适当设置errno。在这种情况下,未指定文件位置(如果有)是否更改。

因此,每个read()将读取指定的字节数;但它读取的字节数可能会更少。"Non-buffered“表示如果指定read(fd, bar, 1),read将只读取一个字节。缓冲IO尝试读取BUFSIZ的数量,即使您只需要一个字符。这听起来可能很浪费,但它避免了进行系统调用的开销,这使得它很快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8975521

复制
相关文章
C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);
清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);setbuf(stdin, NULL);前两者仅对windows有用,最后一个则对Linux系统也适用。那么为什么需要清空键盘缓冲区呢? 以下几个实例:
瑞新
2020/07/07
2.8K0
stdin and stdout which it's ?
最近写了几个C函数,来处理项目中一个Desktop跨应用的进程通信,被32-bit,LE(BE)折磨了很久,stdin and stdout 看起来是一个很简单的标准输入输出,但是处理的过程中,却遇到了很大的障碍,因为历史问题,一个bytes的长度,需要将消息的位置移动4个byte存储消息的长度,先发送给对方,告诉对方我即将发送一个多少长度的byte,反之解析也是亦然。
icepy
2019/06/24
9890
stdin and stdout which it's ?
pyspark之从HDFS上读取文件、从本地读取文件
hdfs上的路径: path="hdfs:///主机名:端口号/地址" 本地上的路径: path"file:///本地地址" 读取文件: rdd=sc.textFile(path)
西西嘛呦
2020/08/26
5.1K0
Linux gzip: stdin: not in gzip format
在解压tar.gz文件的时候报错 tar -zxvf otp_src_18.3.tar.gz gzip: stdin: not in gzip format tar: Child returned
Arebirth
2020/06/19
3.1K0
如何从 Ring Buffer 读取?
原文地址:http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html​​ 作者是 Trisha Gee, LMAX 公司的一位女工程师。 这是理解 LMAX​ 开发的 Disruptor 模式​ 系列博客的下一篇。 从 上一篇博客​ 我们都明白了什么是 Ring Buffer 以及 它有多棒。遗憾的是,我还没有提到当你实际使用 Disruptor 时,怎样读写数据。 ConsumerBarrier 与
张善友
2018/01/29
2K0
如何从 Ring Buffer 读取?
logstash之input配置stdin类型详解
配置示例 input { stdin { type => "demo-stdin" add_field => {"test" => "hello"} codec => "plain" tags => ["stdin-test"] } } output { stdout{ codec=>rubydebug } } 启动 bin/logstash -f /etc/logstash/conf.d/demo-input-stdin.conf 输入test 返回 { "
苦咖啡
2018/04/28
8370
How to Use the Stdin, Stderr, and Stdout Streams in Bash
How to Use the Stdin, Stderr, and Stdout Streams in Bash – Linux Consultant
阿东
2023/03/16
2.8K0
How to Use the Stdin, Stderr, and Stdout Streams in Bash
关于stdin流以及缓冲区浅谈
   突然觉得自己看了很多别人写的东西,学到很多,可惜以后每次都遇到问题忘了又得去网上一通乱找,还找不到自己当初看的写的较好一些东西资料,索性决定从现在起把自己每天获得的看到的一些东西和总结写到博客里面。
渴望飞翔的猪
2022/07/17
1.4K0
从天擎读取EC数据
最近我们在试用天擎,测试了从天擎读取EC数据,请求数据的程序来自天擎网站(见下图),数据传输的速度和稳定度都相当不错,尤其是可以按需求请求数据,避免了“一个馒头搭块糕”式的打包式下载数据对于时间和存储空间的极大浪费。请求江苏地区要素场时,数据基本秒出,感觉畅爽无比
郭好奇同学
2021/03/25
2K0
从天擎读取EC数据
python从txt文件读取数据
  (作为一个python初学者,记录一点学习期间的笔记,方便日后查阅,若有错误或者更加便捷的方法,望指出!)
py3study
2020/01/19
3.9K0
python从txt文件读取数据
PhpSpreadsheet_php标准输入流stdin
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
6870
matlab读取mnist数据集(c语言从文件中读取数据)
mnist database(手写字符识别) 的数据集下载地:http://yann.lecun.com/exdb/mnist/。
全栈程序员站长
2022/08/01
5K0
matlab读取mnist数据集(c语言从文件中读取数据)
Python Numpy 从文件中读取数据
测试文件内容(test1.txt) hello,123,nihao 8,9,10 io,he,no 测试代码 import numpy # dtype:默认读取数据类型,delimiter:分隔符 world_alcohol = numpy.genfromtxt("test1.txt", dtype=str, delimiter=",") # 数据结构 print(type(world_alcohol)) # 数据内容 print(world_alcohol) # 帮助文档 print(help(nump
山海散人
2021/03/03
4.3K0
sl从程序集中读取xaml文件
 StreamResourceInfo sri = Application.GetResourceStream(new Uri("HowTo;component/Page.xaml", UriKind.Relative)); StreamReader sr = new StreamReader(sri.Stream); txtReadxml.Text = sr.ReadToEnd(); {1};component/{2} 1为程序集的名字 2为想读取的页面 page.xaml: <UserCont
用户1172164
2018/01/16
1K0
sl从程序集中读取xaml文件
从控制台读取password – C#
______________________________________________________________
全栈程序员站长
2022/07/06
8330
从控制台读取password – C#
用Pandas从HTML网页中读取数据
本文,我们将通过几步演示如何用Pandas的read_html函数从HTML页面中抓取数据。首先,一个简单的示例,我们将用Pandas从字符串中读入HTML;然后,我们将用一些示例,说明如何从Wikipedia的页面中读取数据。
老齐
2020/05/15
9.6K0
用Pandas从HTML网页中读取数据
zuul动态配置路由规则,从DB读取
前面已经讲过zuul在application.yml里配置路由规则,将用户请求分发至不同微服务的例子。
天涯泪小武
2019/01/17
1.6K0
python 从网络URL读取图片并直接
如下代码段是关于python 从网络URL读取图片并直接处理的代码。 import urllib2 import Image import cStringIO def ImageScale(url,size): file = cStringIO.StringIO(urllib2.urlopen(url).read()) img = Image.open(file) img.show()
py3study
2020/01/08
2.1K0
HDFS——如何从HDFS上读取文件内容
用这个命令bin/Hadoop fs -cat 可以将HDFS上的文件内容读取到控制台。
星哥玩云
2022/06/30
2.8K0
点击加载更多

相似问题

从stdin读取

22

从stdin读取

10

从stdin中读取,然后清除stdin

12

从stdin读取密码

141

从stdin读取脚本

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文