![read 系统调用被信号中断后可以经历短计数吗?](https://linux22.com/image/181117/read%20%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E8%A2%AB%E4%BF%A1%E5%8F%B7%E4%B8%AD%E6%96%AD%E5%90%8E%E5%8F%AF%E4%BB%A5%E7%BB%8F%E5%8E%86%E7%9F%AD%E8%AE%A1%E6%95%B0%E5%90%97%EF%BC%9F.png)
假设我调用read
读取 1000 个字节,当read
读取第 501 个字节时,信号中断它,那么read
返回 500 吗?
答案1
它可以执行至少三件事中的任何一件,具体取决于文件的类型(磁盘、套接字、管道、终端)和信号的时间。
(a) 信号可能在任何数据传输之前到达,在这种情况下 read() 返回 -1,并将 errno 设置为 EINTR。调用者应该显式地重复 read()。
(b) 信号可能会被推迟,直到传输完成,然后正常返回,可能是在调用信号处理程序之后。
(c) 读取可能返回一个短计数,这不是错误。这也可能发生在文件末尾,或者当前没有进一步可用的时候(例如在管道或套接字上),以及当信号中断传输时。调用者需要处理短输入,要么通过处理可变长度部分中的数据,要么通过额外的 read() 调用来完成原始传输的意图。