Ubuntu下read()系统调用使用疑问:两个测试场景问题解析
read()系统调用常见问题解析
测试代码
#include <unistd.h> #include <stdio.h> int main() { int b=10; char buff [b]; int n= read(0,buff,b); write(1,buff,n); printf("%d \n",n); }
问题1:输入"AA"后read()返回值为3而非2
输入"AA"后返回值是3,是因为你输入完两个A后按下了回车键——这个回车键会被转换成换行符\n,所以read()实际读取到的是三个字符:'A'、'A'、'\n',总字节数就是3,和返回值一致。
默认情况下标准输入是行缓冲模式,只有输入换行符时,输入内容才会被提交给read()处理,换行符会被算入读取的字节数里。
问题2:输入11个"A"后的异常输出与shell错误
关于"AAAAAAAAAA10"的由来
read()最多读取10字节,只会取前10个'A'存入buff。write()直接把buff里的10个'A'输出到标准输出,紧接着printf("%d \n",n)会输出10和换行符。因为buff里没有字符串终止符(\0),write()按字节数输出不会自动补终止符,所以write的10个'A'和printf的10会连续输出,看起来就是AAAAAAAAAA10。
关于"A: command not found"的原因
你输入了11个'A',read()只取了前10个,第11个'A'会留在输入缓冲区里。当程序运行结束后,shell会接管输入缓冲区,把剩下的这个'A'当成要执行的命令,所以出现了A: command not found的错误提示。
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

