Функция записи в Linux - PullRequest
       2

Функция записи в Linux

0 голосов
/ 08 сентября 2010

Я пишу в текстовый файл, используя функцию записи с дескриптором файла, установленным в O_NONBLOCK.

fd = open(filepath,  O_RDWR | O_NONBLOCK , 0777);
write(fd, string, size);

У меня есть следующие вопросы:

  1. Насколько велик размер буфера файла до его блокировки?

  2. Если я использую O_NONBLOCK, как указано выше, что произойдет, если буфер уже заполнен? Строка будет отброшена?

  3. Так что для O_NONBLOCK для записи я всегда должен проверять возвращаемое значение write, чтобы увидеть, равно ли оно длине строки, которую мы хотим записать?

  4. Как проверить явление заполнения буфера записи файла? Я создал произвольную длинную строку в письменной форме, но мне кажется, что я все еще не могу произвести эффект отбрасывания строки.

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 сентября 2010

O_NONBLOCK не влияет на дескрипторы файлов (*).write() s, как правило, уже буферизуются ОС в кеше, и сама ОС / файловая система решает, когда данные должны попасть на диск.O_NONBLOCK следует использовать только с сокетами, fifos и трубами.

Если вам нужен ввод / вывод асинхронного файла, вам следует проверить aio_write().

В противном случае,Повторим, что write() уже асинхронен и не ожидает завершения ввода-вывода диска, если вы не используете O_SYNC или O_DSYNC или O_DIRECT flags.

(*) В Linux open () ingфайл с O_NONBLOCK - это всего лишь подсказка, что программа не намеревается читать или записывать в файл - но делает только вызовы слоя ioctl().


Edit1. Проверка реальности, что я не мечтаю. Согласно POSIXv6 :

O_NONBLOCK
При открытии FIFO с настройкой O_RDONLY или O_WRONLY:
[... skip ...]
При открытииоткрывается специальный блок или специальный символьный файл, который поддерживает неблокирование:
[... skip ...]
В противном случае поведение O_NONBLOCK не определено.

0 голосов
/ 08 сентября 2010
  1. Это намеренно оставлено неуказанным, и ваш код не должен об этом знать или беспокоиться.
  2. write () вернет число, которое меньше размера, или даже ноль, в этом случае errnoбудет установлен в EAGAIN.
  3. Определенно.И повторите попытку с того места, где осталась последняя запись ().
  4. Попробуйте выполнить запись в стандартный вывод (fd = 1) и запустите вашу программу через канал, т. Е.

myprogram |(30 снов; кошка)

0 голосов
/ 08 сентября 2010

Существуют разные причины, по которым запись может не удастся полностью записать на fd.

U может легко имитировать блокировку в сокетах, конвейере и т. Д., Где запись была бы заблокирована, если бы потребитель на другой стороне не считывал из потока.

Если вы открыли fdс NON_BLOCK, запись будет записана немедленно с количеством байтов, записанных в поток.Можно использовать эту информацию, чтобы повторить операцию для оставшихся данных.Ни в коем случае не было бы сбрасывания «строки».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...