Linux中的不间断写入
根据对这个问题的回答:linux上的I/O是不可中断的(在睡眠中是不可中断的)。但是如果我启动一个进程,比如说在一个文件上启动一个大的'dd',当进程进行时,我强制卸载文件系统(文件所在的位置),进程就会被终止。理想情况下,它应该处于挂起状态,因为它处于休眠状态,并且是不可中断的。“不可中断”适用于内核处理的低级读/写操作。在C编程中,这些调用大致对应于C标准库上的Linux中的不间断写入,linux,process,linux-kernel,filesystems,signals,Linux,Process,Linux Kernel,Filesystems,Signals,根据对这个问题的回答:linux上的I/O是不可中断的(在睡眠中是不可中断的)。但是如果我启动一个进程,比如说在一个文件上启动一个大的'dd',当进程进行时,我强制卸载文件系统(文件所在的位置),进程就会被终止。理想情况下,它应该处于挂起状态,因为它处于休眠状态,并且是不可中断的。“不可中断”适用于内核处理的低级读/写操作。在C编程中,这些调用大致对应于C标准库上的read()和write()调用。实用程序可以被中断并不能说明I/O操作是否可以被中断,因为实用程序中的特定文件操作可能对应于许多低
read()
和write()
调用。实用程序可以被中断并不能说明I/O操作是否可以被中断,因为实用程序中的特定文件操作可能对应于许多低级I/O操作
在
dd
的情况下,默认传输块大小为512字节,因此复制一个大文件可能包含许多I/O操作<代码>dd可以在这些操作之间中断。我希望这同样适用于大多数对文件进行操作的实用程序。如果您可以强制它们处理巨大的数据块(例如,在dd
中为bs=
指定一个千兆字节大小的参数),那么您可能会看到低级I/O操作是不可中断的。不确定您(以及引用的问题)所说的“不可中断I/O”是什么意思,但处理大量数据肯定会被信号中断。顺便说一句,您可以手动中断dd
进程(例如,使用Ctrl+C
),进程终止速度相对较快。我不认为dd
将使用单个文件操作,更可能是许多小文件操作。@KevinBoone:实际上,dd
将使用bs
字节数调用write
,默认值为512
@Tsyvarev“不间断I/O”意思是:您启动了一个I/O操作,比如说读取操作(大型)进程启动了读取并进入睡眠状态,等待设备的响应,所以现在进程处于睡眠状态,甚至无法被任何信号唤醒。因此是不间断的。@rodrigo——确实如此。因此,除非您将bs
设置为一个很大的值,否则dd
命令可以被中断的事实并不能说明读/写系统调用是否可以被中断,只能说明dd
中的信号处理,当我说I/O操作时,我指的是系统调用。两个I/O之间很可能发生“卸载”,因此它从未进入睡眠状态,并被信号杀死。我将尝试使用非常大的块大小的“dd”,看看如何对卸载做出反应。