Неблокирующее монтирование в Linux

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

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

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


person Alex B    schedule 28.01.2009    source источник
comment
какая-то конкретная причина не разветвлять крепление?   -  person Tanj    schedule 28.01.2009
comment
Я перфекционист и хочу, чтобы он был однопоточным, чтобы использовать как можно меньше ресурсов. :)   -  person Alex B    schedule 28.01.2009
comment
Я бы назвал это преждевременной оптимизацией.   -  person Tanj    schedule 28.01.2009
comment
Да, это так, но я не писал код разветвления/поточности пока, поэтому я бы предпочел не делать ни то, ни другое, если есть простой способ это позволяет делать то, что я хочу, просто изменяя вызов mount(). Вопрос был в том, есть ли такие (типа MNT_DETACH для umount). Скорее всего, нет.   -  person Alex B    schedule 28.01.2009
comment
Это вероятно нет. Это нет.   -  person Sean Bright    schedule 28.01.2009
comment
Что вы в итоге сделали для этого?   -  person Sean Bright    schedule 05.02.2009


Ответы (3)


Нет. Не запуская другой поток или fork()ing, вы должны дождаться возврата mount().

person Sean Bright    schedule 28.01.2009
comment
Правильно... невозможно сделать что-либо асинхронно без многопоточности или разветвления. (+1) - person David Z; 28.01.2009
comment
@David: ну, есть AIO (асинхронный ввод-вывод - и в Linux, который может включать запуск потока, хотя я думаю, что больше нет, если он когда-либо был), но это не помогает при монтировании файловой системы. Но это придирки - ваша главная мысль верна. - person Jonathan Leffler; 28.01.2009
comment
Много чего можно сделать асинхронно, но я не думаю, что mount является одним из них. - person MarkR; 28.01.2009

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

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

person codelogic    schedule 28.01.2009

Вы можете запустить процесс монтирования в фоновом режиме. Вместо запуска что-то вроде:

system("mount -a ");

Do

system("mount -a &");

Это позволит завершить монтаж в фоновом режиме для вас.

Но при ближайшем рассмотрении это решение использует не интерфейс C, а системный интерфейс.

person eaanon01    schedule 28.01.2009