首页 > 解决方案 > 我无法理解 read 系统调用的作用

问题描述

我不知道读完 10 个字符后 read 做了什么。

源代码是这样的:

#include <unistd.h>

int
main(int argc, char *argv[]) {
    char buf[10];

    read(0, buf, 10);
}

我输入了 10 个字符,程序按预期运行,但是当我添加更多字符时,shell 将额外的字符作为命令运行!

在此处输入图像描述

标签: clinux

解决方案


您无法理解代码的作用的原因是源代码很糟糕 - 它在可以/应该使用“幻数”零作为文件描述符时STDIN_FILENO更容易查看它从中读取数据的内容。

它可能会做什么(如果读取没有返回错误)是char从标准输入读取 10 (如果它连接到终端输入,可能会等待您按键);在可能的情况下(假设 UTF-8,其中代码点采用可变数量的字节)10char可能只是(例如)3 个半字符/代码点。

当然,程序在读取后退出,当这种情况发生时(如果标准输入来自终端输入)终端输入将在程序退出后连接回终端,所以第 10 号之后的任何数据char(可以以格式错误的“多字节代码点的最后一部分”)将转到终端。


推荐阅读