繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM