Непрерывные звонки чтения / записи - PullRequest
1 голос
/ 30 июля 2010

В какой-то момент во время моих приключений по программированию на C для Linux я столкнулся с флагами (возможно, ioctl / fcntl?), Которые делают чтение и запись в дескриптор файла бесперебойным.

К сожалению, я не могу вспомнить, как это сделать или где я это читал. Кто-нибудь может пролить свет?

Update0

Чтобы уточнить мой запрос, я после той же блокировки и гарантирую, что fwrite() и fread() обеспечивают, без буферизации пространства пользователя.

Ответы [ 2 ]

1 голос
/ 31 июля 2010

Вы можете избежать 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;
}
0 голосов
/ 30 июля 2010

Вы хотите отключить прерывания при чтении / записи или гарантировать, что никто не будет читать / записывать файл, пока вы?

Во-вторых, вы можете использовать fcntl() F_GETLK, F_SETLK и F_SETLKW, чтобы получить, снять и протестировать блокировки записей соответственно. Однако, поскольку блокировки POSIX носят только рекомендательный характер, Linux не применяет их - это имеет смысл только между взаимодействующими процессами.

Первая задача включает погружение в ноль и отключение прерываний на локальном процессоре (или на всех, если вы работаете в системе SMP). Не забудьте включить их снова, когда закончите!

...