C Linux中的非阻塞装载

C Linux中的非阻塞装载,c,linux,mount,C,Linux,Mount,我在单线程进程中使用Linux的mount(2)函数。但是像CD-ROM这样的设备的安装可能需要一段时间(我所看到的最糟糕的情况是40秒!),因为它需要考虑一下,旋转磁盘,然后才能安装文件系统。这可能会在相当长的时间内阻止进程处理其他事件 我似乎找不到以非阻塞方式装载文件系统的方法有没有一种方法可以在不使用多线程或分叉的情况下异步装载文件系统? 知道操作是否完成对我来说不是问题,因为我已经在同一个线程中读取了内核事件。否。如果不启动另一个线程或fork()ing,您必须等待mount()返回。如

我在单线程进程中使用Linux的
mount(2)
函数。但是像CD-ROM这样的设备的安装可能需要一段时间(我所看到的最糟糕的情况是40秒!),因为它需要考虑一下,旋转磁盘,然后才能安装文件系统。这可能会在相当长的时间内阻止进程处理其他事件

我似乎找不到以非阻塞方式装载文件系统的方法有没有一种方法可以在不使用多线程或分叉的情况下异步装载文件系统?


知道操作是否完成对我来说不是问题,因为我已经在同一个线程中读取了内核事件。

否。如果不启动另一个线程或
fork()
ing,您必须等待
mount()
返回。

如果要以单线程方式执行,您可以手动执行mount命令,并使用select()或其他方法对其进行后台处理和轮询以完成。然而,这是一种黑客行为,与在程序中分叉和调用mount()没有太大区别


另外值得注意的是,我经历过mount()阻塞整个进程(以及相关线程),因此对于真正的异步行为,分叉可能是一种方法。

您可以让装载进程在后台运行。 而不是像这样跑:

system("mount -a ");

这将让你在背景中完成mouning


但是仔细看一下,这个解决方案不使用C接口,而是使用系统接口

有什么特殊原因不使用挂载吗?我是一个完美主义者,希望保持单线程,尽可能少地使用人力资源。:)我认为这是过早的优化。是的,但我还没有编写分叉/线程代码,所以如果有一种简单的方法允许通过修改mount()的调用来完成我想要的任务,我宁愿避免这样做。问题是是否存在任何(如MNT_DETACH for umount)。答案很可能是“不”。不可能是“不”。是的。。。没有多线程或分叉,就无法异步执行任何操作。(+1)@David:嗯,有AIO(异步I/O,在Linux上可能需要启动一个线程,尽管我认为已经没有了,如果它曾经启动过的话),但是它在安装文件系统时没有帮助。但这是一种诡辩——你的主要观点是准确的。很多事情都可以异步完成,但我不认为mount是其中之一。
system("mount -a &");