Вы можете избежать EINTR
из read()
и write()
, убедившись, что все ваши обработчики сигналов установлены с флагом SA_RESTART
sigaction()
.
Однако это не защитит вас от короткий читает / пишет.Это возможно только путем помещения read()
/ write()
в цикл (для этого не требуется дополнительный буфер помимо того, который уже должен быть предоставлен для вызова read()
/ write()
.)
Такой цикл будет выглядеть так:
/* If return value is less than `count', then errno == 0 indicates end of file,
* otherwise errno indicates the error that occurred. */
ssize_t hard_read(int fd, void *buf, size_t count)
{
ssize_t rv;
ssize_t total_read = 0;
while (total_read < count)
{
rv = read(fd, (char *)buf + total_read, count - total_read);
if (rv == 0)
errno = 0;
if (rv < 1)
if (errno == EINTR)
continue;
else
break;
total_read += rv;
}
return rv;
}