c-在被EINTR信号中断后,read()或write()系统调用是否可以继续


ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
if (ret == -1) {
if (errno == EINTR)
continue;
perror ("read");
break;
}
len -= ret;
buf += ret;
}

我想知道如果它收到一个中断信号,这个代码怎么能继续它停止的地方。在这种情况下,read((系统调用必须重新启动,它不是从头开始吗?同样的事情也适用于write((系统调用。你能解释一下这些系统调用在这些情况下的行为吗?

https://linux.die.net/man/3/read

如果read()在读取任何数据之前被信号中断,它将返回-1,errno设置为EINTR

如果read()在成功读取某些数据后被信号中断,则应返回读取的字节数。

在任何一种情况下,对read()的下一次调用都将继续读取调用中断前停止的位置。

如果read((未检索到消息中的所有数据,则剩余数据应留在STREAM上,并可由下一个read(((调用检索。

最新更新