2009-01-28 5 views
3

Я использую функцию Linux mount(2) в однопоточном процессе. Но установка устройств, таких как CD-ROM, может занять некоторое время (худшее, что я видел, это 40 секунд!), Так как он немного поразмыслит, раздвинет диск и только потом смонтирует файловую систему. Это может блокировать процесс от обработки других событий в течение значительного времени.Неблокируемое монтирование в Linux

Я не могу найти способ монтировать файловую систему неблокирующим способом. Есть ли способ монтировать файловую систему асинхронно без многопоточности или разветвления?

Зная, действительно ли действие выполнено, для меня не проблема, поскольку я уже читал ядро ​​uevents в том же потоке.

+0

какой-либо конкретной причины не раскошелиться на гору? – Tanj

+0

Я перфекционист и хочу, чтобы он был однопоточным, чтобы использовать как можно меньше ресурсов. :) –

+0

Я бы поставил это как преждевременную оптимизацию. – Tanj

ответ

12

№. Не стреляя в другую нить или fork() ing, вам нужно подождать mount(), чтобы вернуться.

+0

Правильно ... нет никакого способа сделать что-либо асинхронно без многопоточности или разветвления. (+1) –

+0

@ David: есть AIO (асинхронный ввод-вывод - и в Linux, который может включать запуск потока, хотя я думаю, что не больше, если он когда-либо был), но это не помогает, когда установка файловой системы. Но это придирка - ваш главный вопрос точен. –

+2

Множество вещей можно сделать асинхронно, но я не думаю, что одним из них является mount. – MarkR

1

Если вы хотите сделать это одним поточным способом, вы можете вручную выполнить команду mount, а также выполнить фоновое и опрос для завершения, используя select() или что-то в этом роде. Тем не менее, это хаки и не очень отличается от forking и вызова mount() в вашей программе.

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

2

Вы можете позволить процессу монтажа работать в фоновом режиме. Insted работать Somthing как:

system("mount -a "); 

ли

system("mount -a &"); 

Это позволит mouning полный в фоновом режиме для вас.

Но после того, как выглядит немного ближе, это решение не использовать интерфейс C, но интерфейс системы

Смежные вопросы