[英]The system call write(fd, buf, len) may return 0 when len > 0?
[英]Does the linux system call read(fd, buf, count) return less than count when fd is a regular file?
当我们在Linux上调用read(fd, buf, count)
时,系统(函数)调用的返回值是否可以小于count,而不是文件末尾的字节数较少的情况?
我在手册页中查找它,上面写着
“成功后,将返回读取的字节数(零表示文件末尾),并且文件位置以该数字前移。如果此数目小于请求的字节数,这不是错误;这可能发生在例如,因为现在实际上实际可用的字节较少(也许是因为我们接近文件末尾,或者因为我们正在从管道或终端read()
), 或者因为read()
被信号中断了 。”
所以这是我的问题:如何通过信号中断常规文件上的read()
? 通过什么可能的信号?
该文档页面指定哪些调用可以被信号中断,并且read()
在列表中。 您必须在Linux中使用SA_RESTART
启用此行为,默认情况下未启用。
是的, read()
可以被信号中断。 但是,当进程正在从属于文件系统上文件的描述符中读取时,则不是这样。
当进程在文件上调用read()
,它将进入所谓的不间断睡眠 。 在这种模式下,直到系统调用完成,进程才会处理任何信号。 由于某些错误或在读取请求的数据时。
注意 :当进程处于不间断的睡眠状态时,您甚至无法使用SIGKILL信号终止它。 否则换句话说, kill $pid -9
将无效。
在这个问题中,有一个不间断睡眠的解释: 什么是不间断的过程?
请进一步注意 :在现实生活中,有趣的情况是硬盘驱动器出现故障,并且所有试图将数据写入该磁盘(文件系统)或从中读取数据的进程都被卡住,并且除了重新启动硬盘外,无法通过其他任何方式杀死系统。 对于通过网络(例如NFS)安装的卷也是如此。
编辑:如psmears所指出的,如果指定了通过NFS的iff intr
挂载选项挂载的卷上的文件读取,则read()
可能会中断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.