LINUX.ORG.RU

Неблокирующий write в файловый дескриптор

 


0

2

Добрый день, подскажите, можно ли реализовать такую вещь как запись в файловый дескриптор например 4 байт за определенное время и если не удалось то выход по тайм-аут. Попробовал с select, но что-то не вышло.


Ты имеешь ввиду в настоящий файл на диске? Нет, там неблокируемый режим не предусмотрен. Ты можешь его эмулировать с помощью тредов, но отменить после таймаута всё равно будет нельзя. То есть ты в своей проге можешь считать «запись не удалась, идём дальше», но write() в другом треде всё равно будет висеть и ждать ответа от диска столько, сколько потребуется, и в итоге выдаст какой-то код возврата.

Упомянутый выше aio_write делает по сути то же самое, только всю возню с тредами прячет внутрь, и менее управляемый чем если ты вручную будешь это делать.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Упомянутый выше aio_write делает по сути то же самое, только всю возню с тредами прячет внутрь,

сомневаюсь. Ты хочешь заказать, что если мне нужно работать с 1000 файлами, то следует создать 1000 потоков, вместо использования AIO? Тогда какой в нем (AIO) смысл?

и менее управляемый чем если ты вручную будешь это делать.

в чем заключается меньшая управляемость?

MirandaUser2
()
Ответ на: комментарий от MirandaUser2

Смысл в aio такой что он работает из коробки и не требует муторного кодинга. Если у тебя нет больших нагрузок - можешь на нём и остановиться.

1000 потоков на 1000 файлов конечно не надо, в том и дело что там всё сложнее и в идеале надо реализовывать вручную очереди запросов к физическим дискам с учётом допустимого параллелизма и требований приложения.

firkax ★★★★★
()

Если по-современному, посмотри на примеры liburing. Вот что выдаёт $ ./ucontext-cp, например:

./ucontext-cp: infile1 outfile1 [infile2 outfile2 […]]

$ ./ucontext-cp Makefile Makefile.copy helpers.c helpers.c.copy:

copying 2 files...
4->5: readv 1024 bytes from 0
6->7: readv 1024 bytes from 0
4->5: writev 1024 bytes from 0
6->7: writev 1024 bytes from 0
4->5: wait 1s
6->7: wait 1s
4->5: readv 1024 bytes from 1024
6->7: readv 1024 bytes from 1024
4->5: writev 321 bytes from 1024
6->7: writev 383 bytes from 1024
4->5: done with ret code 0
6->7: done with ret code 0
finished with 2 success(es) and 0 failure(s)
dataman ★★★★★
()
Ответ на: комментарий от firkax

Файл на файловой системе samba, я открываю файл для записи, потом начинаю писать поблочно, потом выдергиваю ethernet кабель и зависаю на write секунд на 30, не могу понять где именно этот тайм-аут выставляется.

da17
() автор топика