read 系统调用被信号中断后可以经历短计数吗?

read 系统调用被信号中断后可以经历短计数吗?

假设我调用read读取 1000 个字节,当read读取第 501 个字节时,信号中断它,那么read返回 500 吗?

答案1

它可以执行至少三件事中的任何一件,具体取决于文件的类型(磁盘、套接字、管道、终端)和信号的时间。

(a) 信号可能在任何数据传输之前到达,在这种情况下 read() 返回 -1,并将 errno 设置为 EINTR。调用者应该显式地重复 read()。

(b) 信号可能会被推迟,直到传输完成,然后正常返回,可能是在调用信号处理程序之后。

(c) 读取可能返回一个短计数,这不是错误。这也可能发生在文件末尾,或者当前没有进一步可用的时候(例如在管道或套接字上),以及当信号中断传输时。调用者需要处理短输入,要么通过处理可变长度部分中的数据,要么通过额外的 read() 调用来完成原始传输的意图。

相关内容