当fd是常规文件时,linux系统调用read(fd,buf,count)是否返回小于count?

时间:2015-02-13 13:50:14

标签: c linux system-calls

当我们在Linux上调用read(fd, buf, count)时,系统(函数)调用的返回值是否可以小于除文件结尾的字节数较少的情况之外的计数?

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

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

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

2 个答案:

答案 0 :(得分:2)

This documentation page指定哪些呼叫可以被信号中断,read()在列表中。您必须在Linux中启用此行为(使用SA_RESTART),默认情况下它不会启用。

答案 1 :(得分:2)

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

当进程调用文件read()时,它会进入所谓的不间断睡眠。在此模式下,在系统调用完成之前,进程将不会处理任何信号。要么是因为某些错误,要么是在读取请求的数据时。

注意:当进程处于不间断睡眠状态时,您甚至无法使用SIGKILL信号终止它。或者换句话说kill $pid -9没有效果。

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

进一步注意 :当硬盘出现故障时,有一些有趣的现实案例以及尝试将数据写入该磁盘的所有进程(文件)系统)或从它读取卡住,除了重新启动系统之外,不能通过任何方式杀死它。对于通过网络安装的卷也是如此,例如NFS。

编辑,因为 psmears 已经指出,如果从卷上的文件读取,read()可以被中断,通过NFS iff挂载 intr指定了挂载选项。