当我们在 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/