read()函数的困惑

时间:2023-02-22 18:27:35
#define BUF_SIZE 10

int main()
{
int cnt;
char buf[BUF_SIZE];
cnt = read(STDIN_FILENO, buf, BUF_SIZE);
printf("cnt = %d\n", cnt);
return 0;
}

给定代码如上所示。编译后运行。

./a.out
abc
cnt = 4

abc 是输入的数据,加上换行符,因此是4个字符,cnt=4。

但是此时如果我们使用重定向,采用文件作为输入,文件中包含两行的内容。我们会发现read()函数不会在读到换行符后就停止,而是直接读完整个文件。

//inside input_file. This line is not in the file.
123
456

得到

./a.out < input_file
cnt = 8

可以看到,read()函数对于不同的输入来源有着不同的行为。我在此处找到了相应的解释。下面是搬运。链接种还说明了一些较为不常见的情况,下面只搬运了较常用的情形:

read()函数对于不同的输入会有不同的表现。对于一般的文件输入,如果要求读入N个字符,那么在有N个字符可供读入的情况下,read()会读入N个字符,如果已经读到文件尾也即EOF,小于N的个数的字符会被读取。

如果read()是从一个标准的终端读入数据,那么tty驱动器会以一次一行的形式向read()提供输入。因此如果你令read()读入3个还是300个字符,read()都会被挂起,直到tty遇到一个换行符,或者遇到EOF后将数据提供给read()。而read()在读取数据后则会将实际读取的字符个数返回,该个数为请求读入的字符个数或者可供读入数据的个数中的较小者。

若读取的文件描述符被设置成为非阻塞,那么read()在没有数据可供读取时将立即返回而不阻塞,返回值是-1,且errno会被设为EAGAIN or EWOULDBLOCK,这种情况一般用于对套接字的读取。

因此在使用read()时需要小心,不一定请求读取多少数据就会读到多少数据,此外,还有可能会遇到如EINTR等非致命性错误,这个错误提示你需要重试read()

read()函数的困惑的更多相关文章

  1. 利用 UDF 轻松迁移

    位运算.布尔运算和逐位运算的乐趣 如果您正从支持位运算.布尔运算以及一些函数的数据库迁移到 IBM® DB2® Universal Database™(UDB),那么您也许会对如何在 DB2 中处理这 ...

  2. Python 3&period;9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?

    原作:Jake Edge 译者:豌豆花下猫@Python猫 英文:https://lwn.net/Articles/819853/ 随着 Python 3.9.0b1 的发布,即开发周期中计划的四个 ...

  3. Python 3&period;9 beta2 版本发布了,看看新特性?

    随着 Python 3.9.0b1 的发布,即开发周期中计划的四个 beta 版本的首个,Python 3.9 的功能已经是完善了.在 10 月发布最终版本之前,还会有许多测试和稳定性方面的工作要做. ...

  4. BZOJ&lowbar;2186&lowbar;&lbrack;Sdoi2008&rsqb;沙拉公主的困惑&lowbar;欧拉函数

    BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数 Description 大富翁国因为通货膨胀,以及假钞泛滥,*决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,*只发行 ...

  5. Bzoj 2186&colon; &lbrack;Sdoi2008&rsqb;沙拉公主的困惑 乘法逆元&comma;线性筛&comma;欧拉函数&comma;数论

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2560  Solved: 857[Submit][St ...

  6. BZOJ2186 &lbrack;Sdoi2008&rsqb;沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 5003  Solved: 1725 [Submit] ...

  7. 【bzoj2186】&colon; &lbrack;Sdoi2008&rsqb;沙拉公主的困惑 数论-欧拉函数

    [bzoj2186]: [Sdoi2008]沙拉公主的困惑 考虑当 gcd(a,b)=1 则 gcd(nb+a,b)=1 所以[1,N!]与M!互质的个数就是 筛出[1,M]所有的素数p[i] 以及逆 ...

  8. 【bzoj2186】&lbrack;Sdoi2008&rsqb;沙拉公主的困惑 欧拉函数

    题目描述 大富翁国因为通货膨胀,以及假钞泛滥,*决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,*只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...

  9. ASP&period;NET Core端点路由中三种让人困惑的路由函数

    早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和 路由,其核心目的是将 请求落地点与路由寻址方式解耦. 这里面有几个容易混淆的函数 MapControllerRoute M ...

随机推荐

  1. BeanUtils&period;populate&lpar;obj&comma; map&rpar;&semi;

    public static void populate(Object bean, Map<String, ? extends Object> properties) throws Ille ...

  2. 实现Android包的批量删除

    由于手机内存有限,有时需要一次删除很多个包,这时就需要一个实现Android包批量删除的应用. 首先是布局文件: <?xml version="1.0" encoding=& ...

  3. Python学习教程&lpar;learning Python&rpar;--1&period;2&period;1 Python输出语句print基本使用

    Python提供很多的内建(built-in)函数,使用者可以不用自己写代码就可以完成一个功能很强大的程序, 在Python里使用最多的(也许是)print函数主要用于用户输出信息. 基本用法:pri ...

  4. python 行转列

    #encoding=utf- print '中国' #二维阵列变换 行转化成列,列转化成行 lista=[[,,],[,,],[,,],[,,]] #使用列表推导 listb=[[r[col] ])) ...

  5. Jquery获对HTML控件的控制

    Jquery获对HTML控件的控制 1.获取控件的值 1.1.radio 1.1.1 获取一组radio被选中项的值  var item = $('input[name=items][checked] ...

  6. &lpar;简单&rpar; POJ 3667 Hotel,线段树&plus;区间合并。

    Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...

  7. 读阿里巴巴Java开发手册v1&period;2&period;0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...

  8. KNN算法简单应用

    这里是写给小白看的,大牛路过勿喷. 1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集 ...

  9. 02-模拟Junit4功能

    package com.day2; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; im ...

  10. 二值化函数cvThreshold()参数CV&lowbar;THRESH&lowbar;OTSU的疑惑【转】

    查看OpenCV文档cvThreshold(),在二值化函数cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max ...