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(((调用检索。