中断的系统调用-鸿鹄论坛_华为认证h35-211-hcnp-access network题库
10.5中断的系统调用早期UNIX系统的一个特性是:如果在进程执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行。该系统调用返回出错,其errno设置为EINTR。这种处理方式的理由是:因为一个信号发生了,进程捕捉到了它,这意味着已经发生了某种事情,所以是个好机会应当唤醒阻塞的系统调用。在这里,我们必须区分系统调用和函数。当捕捉到某个信号时,被中断的是内核中执行的系统调用。
为了支持这种特性,将系统调用分成两类:低速系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用,它们包括:在读某些类型的文件时,如果数据并不存在则可能会使调用者永远阻塞(管道、终端设备以及网络设备)。在写这些类型的文件时,如果不能立即接受这些数据,则也可能会使调用者永远阻塞。打开文件,在某种条件发生之前也可能会使调用者阻塞(例如,打开终端设备,它要等待直到所连接的调制解调器回答了电话)。pause(按照定义,它使调用进程睡眠直至捕捉到一个信号)和wait。某种ioctl操作。某些进程间通信函数(见第14章)。
在这些低速系统调用中一个值得注意的例外是与磁盘I/O有关的系统调用。虽然读、写一个磁盘文件可能暂时阻塞调用者(在磁盘驱动程序将请求排入队列,然后在适当时间执行请求期间),但是除非发生硬件错误,I/O操作总会很快返回,并使调用者不再处于阻塞状态。
可以用中断系统调用这种方法来处理的一种情况是:一个进程起动了读终端操作,而使用该终端设备的用户却离开该终端很长时间。在这种情况下进程可能处于阻塞状态几个小时甚至数天,除非系统停机,否则一直如此。与被中断的系统调用相关的问题是必须用显式方法处理出错返回。典型的代码序列(假定第10章信号207下载。
相关文件下载数组中提取的链接和图片:
读者可以更深入地了解UNIX系统调用的细节和实际操作方法,有助于更好地理解和应用系统调用中断的处理机制。