kill会不会被信号打断?

问题描述 投票:1回答:1

例如,如果我使用kill(C库signal.h中的一个函数)向子程序发出一个SIGINT信号,在kill函数返回之前,子程序发出的SIGCHLD信号是否会被捕获?

c process signals fork sigkill
1个回答
4
投票

kill syscall是不可中断的(至少根据 人页),仍有至少两种情况下,在这两种情况下。SIGCHLD 处理程序可以在函数返回之前运行。

  1. 如果你的进程中有另一个线程, 内核可能会选择在函数返回之前就运行信号处理程序 kill syscall在你的第一个线程中返回。
  2. 你可能使用了一个封装函数来实现 kill 从你的libc。信号处理程序可以在syscall返回到它和它返回到你的代码之间运行。

所以,如果你想确保你不会得到的 SIGCHLD 直到 kill 返回,那么你需要使用 sigprocmask 阻止它之前的 kill 直到你准备好。


2
投票

信号处理是异步的。 因此,无论哪种方式,都不能保证是否会有 SIGCHLD 子女终止时发出的消息,将由父方在 kill 调用返回。 我的猜测是 kill平时 夺标而归 SIGCHLD 到达,但依赖这个是不安全的。


2
投票

我不知道这是否回答了你的问题,但是,在阅读Linux手册的时候,可能的返回值是 killEINVAL, EPERMESRCH. EINTR 不是其中之一。 这让我觉得这个函数不会被中断。 至少,系统调用不会被中断。

编辑:我的意思是 errno,而不是返回,值。

© www.soinside.com 2019 - 2024. All rights reserved.