c - 当 fd 是一个普通文件时,linux 系统调用 read(fd, buf, count) 是否返回小于 count?

标签 c linux system-calls

当我们在 Linux 上调用 read(fd, buf, count) 时,系统(函数)调用的返回值可以小于 count 吗?文件结束?

我在手册页上查了一下,它说

“成功时,返回读取的字节数(零表示文件结束),文件位置由此向前推进 数字。如果此数字小于请求的字节数,则不是错误;例如,这可能会发生 因为现在实际上可用的字节更少(可能是因为我们接近文件末尾,或者因为我们正在阅读 来自管道或终端),或者因为 read() 被信号中断。”

所以这是我的问题: 常规文件上的 read() 如何被信号中断?通过什么可能的信号?

最佳答案

是的,read() 可以被信号中断。但不是当进程正在从属于文件系统上的文件的描述符中读取时。

当进程在文件上调用 read() 时,它会进入所谓的不间断 sleep 。在这种模式下,在系统调用完成之前,进程不会处理任何信号。由于某些错误或读取请求的数据时。

注意:当进程处于不可中断的 sleep 状态时,您甚至不能用 SIGKILL 信号终止它。或者换句话说,kill $pid -9 将无效。

在这个问题中有一个不间断 sleep 的解释: What is an uninterruptable process?

进一步注意:当硬盘驱动器出现故障并且所有进程都试图将数据写入该磁盘(文件系统)或从中读取被卡住,除了重新启动系统外,无法通过任何方式终止。对于通过网络安装的卷也是如此,例如 NFS。

编辑:正如psmears 所指出的,read() 如果从卷上的文件中读取,则可能会被中断,通过NFS iff intr 已指定装载选项。

关于c - 当 fd 是一个普通文件时,linux 系统调用 read(fd, buf, count) 是否返回小于 count?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28501133/

相关文章:

linux - 纳斯姆 x86_64 : Why can't I write and read from the same file?

从程序内部使用 'system()' 调用命令

linux-kernel - Linux 'socketcall'系统调用实现

c - 指针和打印问题

c - 使用 C 中的数组以程序方式生成描述,但它返回的是一团乱麻

linux - 使用 'sed' shell 命令部分替换字符串

linux - 用多行文本替换单行

c - 设计交互式客户端

c - 如何查看当前用户是否有管理权限

linux - 如何使屏幕 session 使用与原始终端相同的设置