SA_RESTART

Provide behavior compatible with BSD signal semantics by making certain system calls restartable across signals.

1, 訊號將中斷慢阻塞调用, 导致这些调用返回-1并且errno=EINTR表示被信号中断.
2, 部分函数是自启动的, 即永远不会返回-1与errno=EINTR, 它们在信号函数处理返回后继续执行完成, 而不是以彻底的失败告终.

这里很明确的说明, 这个flag只是为了兼容BSD, 明确的指定让能够自启动的慢阻塞调用能够从信号中断中恢复并继续, 它并没有令所有调用都恢复的本事, 要搞清楚.

楼主貌似疑惑的点很普通... 假设调用sleep(10):

1, 假设它不能自启动, 那么sleep(10)被信号中断, 等信号函数返回后sleep(10)立即失败返回-1, errno=EINTR. 也许此时才睡了5秒而已.
2, 假设它能够自启动, 并通过SA_RESTART设置信号处理函数明确的帮助慢阻塞调用重启动, 那么sleep(10)在5秒被中断, 信号函数结束后会继续睡另外5秒, 然后正常返回.

arrow
arrow
    全站熱搜

    ryan0988 發表在 痞客邦 留言(0) 人氣()