【问题标题】:Can program return/terminate before the kill function is called?程序可以在调用 kill 函数之前返回/终止吗?
【发布时间】:2023-03-28 12:57:02
【问题描述】:

我对 kill(pid, signal) 函数的工作原理有点困惑——我相信它是异步的,所以信号可能要等到执行了更多指令之后才会到达。我的问题是,如果您调用 kill(pid, signal) 然后在下一行返回(如下所示),您是否保证在程序终止之前将捕获并处理信号,或者是否可以在不处理的情况下退出如果我们在 kill 函数完成之前运行“return 0”会发出什么信号?

kill(pid, SIGUSR1);
return 0;

【问题讨论】:

  • 你是在暗示pid 这里是进程本身的 pid 吗?还是一些子进程?
  • 手册页显示“成功时(至少发送了一个信号),返回零。”发送是有保证的,但在返回之前不能保证(很可能不能)接收部分对该信号的接收和操作。

标签: c++ c signals kill


【解决方案1】:

如果一个进程只向自己发送一个信号,并且该信号没有被阻塞,并且该进程没有其他待处理的信号,则该信号将被同步发送(即在kill() 返回之前)。

这还不足以保证 100% 可靠,因此您可能不想依赖它。例如,另一个进程可能恰好在同一时间发送不同的信号;这可能超出了您的控制范围。

如果一个进程向不同的进程发送信号,则无法保证在kill() 返回之前会收到该信号。但即使信令功能终止也会发送。

如果有多个进程会收到信号,kill可能会在第一个信号发出后返回,不保证是信号进程。同样,这可能会导致进程在接收到信号之前返回。某些平台可能会提供额外的保证。

这是Posix specification

如果pid 的值导致为发送进程生成sig,并且如果sig 没有为调用线程阻塞,并且如果没有其他线程未阻塞sig 或正在等待@ sig 的 987654329@ 函数,sig 或至少一个待处理的未阻塞信号应在 kill() 返回之前传递给发送线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2016-09-27
    • 2014-02-19
    • 2017-08-13
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多