Linux内核新手疑问:read系统调用后的整数是否为文件描述符?
read系统调用中的整数值含义解析
首先明确:你看到的read(0,、read(5,里的第一个整数确实是文件描述符(File Descriptor)。
一、文件描述符是什么?
文件描述符是Linux系统给每个进程打开的文件、套接字、管道等资源分配的整数标识,进程通过它来操作对应的资源。系统默认会给每个进程分配三个标准描述符:
0:标准输入(stdin)1:标准输出(stdout)2:标准错误(stderr)
你示例里的5、6、4这些,都是进程后续打开的其他资源(比如配置文件、网络套接字、管道)对应的描述符。
二、read系统调用的参数与返回值含义
read系统调用的格式是:read(fd, buf, count),各个部分的含义:
- 第一个整数(fd):就是前面说的文件描述符,指定要读取哪个资源
- 第二个参数(buf):内存缓冲区地址,用来存储读取到的数据(示例里显示的是读取到的部分内容)
- 第三个整数(count):请求读取的最大字节数
- 等号后的整数:这是
read的返回值:- 正数:实际成功读取的字节数(比如示例里的
=548表示从描述符6读取了548字节) 0:表示已经读到了文件/数据流的末尾(EOF),没有更多数据可读- 负数:表示读取出错,具体错误码可以通过
errno查看
- 正数:实际成功读取的字节数(比如示例里的
三、结合你的示例具体说明
以下是翻译后的跟踪日志(这是strace工具输出的系统调用记录):
3342 read(6, "\n# 该文件控制系统上SELinux的状态。\n# SELI"..., 4096) = 548 3342 read(6, "", 4096) = 0 3342 read(6, "privsep_preauth=sshd_net_t\n", 4096) = 27 3342 read(6, "", 4096) = 0 3342 read(6, "system_u:system_r:sshd_t:s0-s0:c0.c1023\0", 4095) = 40 3342 read(4, "\0\0\5\344\n\248\\\371\240\212\20j\204,\272\253-\332\326\351\303\0\0\0\361curve25519-sha256,curve25519-sha256@li"..., 8192) = 1512 3341 read(6, "\0\0\0a", 4) = 4 3342 read(5, <未完成...> 3341 read(6, "x\0\0\0\0\0\0\0\35chacha20- poly1305@openssh.com\0\0\0\n<implicit>\0\0\0\4none\0\0\0\21"..., 97) = 97 3342 <... read 恢复>"\0\0\0\1", 4) = 4 3342 read(5, "y", 1) = 1
- 第一行:进程3342从文件描述符6读取,请求读4096字节,实际读到548字节,内容是SELinux配置文件的开头
- 第二行:同样读描述符6,返回0,说明到了该资源的末尾
- 后面出现的
<未完成...>和<... read 恢复>:表示这个read调用因为等待数据(比如网络套接字还没收到数据)被内核挂起,之后数据到达才继续完成,最后返回实际读到的字节数
内容的提问来源于stack exchange,提问作者sysadreq
相关产品推荐
相关产品推荐

