apue-信号2——可重入函数和中断函数

阻塞函数

一些系统调用可能会阻塞相当长的一段时间(或永远阻塞),例如以下这些:

• read(2) from files that can block (pipes, networks, terminals)
• write(2) to the same sort of files
• open(2) of a device that waits until a condition occurs (for example, a modem)
• pause(3), which purposefully puts a process to sleep until a signal occurs
• certain ioctl(2)s
• certain IPC functions
• file- or record-locking mechanisms

如果信号处理函数在系统调用在阻塞时被调用,那么:

  1. (该系统调用被强制终止)the call may be forced to terminate with the error EINTR

  2. 该系统调用可能提前返回(the call may return with a data transfer shorter than requested)

  3. 在信号处理函数返回时,该系统调用自动重启

  4. 发生哪种行为取决于接口以及是否使用SA_RESTART标志建立了信号处理程序(请参见sigaction(2))
    Which of these behaviors occurs depends on the interface and whether or not the signal handler was established using the SA_RESTART flag (see sigaction(2))

  5. 其中大部分是特定于操作系统的,在某些平台上,只有某些调用可以重新启动,而其他调用在中断时总是会失败
    much of this is OS specific, and on some platforms only some calls may be restarted, while others always will fail when interrupted

注意:会存在可移植性的问题,应该尽量避免在信号处理函数中使用这些(低速)阻塞函数

  1. 只有保证异步信号安全的函数才能安全地在信号处理程序中使用(Only functions that are guaranteed to be async-signal-safe can safely be used in signal handlers)
  2. POSIX保证了一组这样的异步信号安全功能。 不同的操作系统(版本)可能会添加额外的。POSIX guarantees a set of such async-signal-safe functions; different OS (versions) may add others.
  3. 有些异步安全函数可能会设置 errno, 最好保存并重置
  4. 低速系统调用可能会失败、重启、提前返回。这在很大程度上取决于操作系统风格和版本的差异这会带来移植性方面的问题。Interrupted system calls may fail, return short, or be restarted, again very much subject to variance across OS flavors and versions.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东阳z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值