【问题标题】:Process terminated when signaling a pthread waiting on "join"发出信号等待“加入”的 pthread 时进程终止
【发布时间】:2012-04-11 10:37:51
【问题描述】:

我正在尝试实现信号处理程序。 每个 pthread 都是可连接的,并且使用 sigprocmask 在所有信号上阻塞。

当我使用

从另一个线程向线程发送信号时,就会出现问题
pthread_kill(_threads[threadIndex], SIGHALT);

如果在发送信号时被调用的 pthread 正在等待 pthread_join,则整个进程立即终止。但是,如果线程没有等待加入,它会按预期忽略信号。知道为什么会发生这种情况以及如何改变它吗?

谢谢!

【问题讨论】:

  • 是进程终止,还是pthread_join返回错误码,导致程序执行完毕?
  • 有人知道SIGHALT吗?没见过。和SIGSTOP一样吗?
  • @Pavan Manjunath:也许是德国版的 SIGSTOP? ;-)
  • 这是什么操作系统?我也不熟悉 SIGHALT,我怀疑与答案相关的知识......
  • @Pavan Manjunath 抱歉缺少信息... SIGHALT 是我应该为练习目的创建的一个新信号,使用宏和线程相互发送信号等...所以你可以冷静下来——没有一个信号是你不熟悉的。事实证明 - 该错误在其他地方,现在已修复。谢谢大家的回答。

标签: c multithreading join signals


【解决方案1】:

关于在多线程环境中使用sigprocmask(),请参阅方法手册页的以下摘录:

在多线程进程中未指定 sigprocmask() 的使用; 参见 pthread_sigmask(3)。


我对@9​​87654322@ 有点不确定,但假设它是SIGSTOP 的同义词,pthread_kill() 手册页中的以下内容可能会引起您的兴趣:

信号处置是进程范围的:如果信号处理程序是 安装后,处理程序将在线程线程中调用,但如果 信号的处置是“停止”、“继续”或“终止”, 这个动作会影响整个过程。

【讨论】:

  • 即使是德国人也不能忽略SIGSTOP 信号:) 但是OP引用了一个线程成功忽略信号的情况。所以我猜SIGHALT 不是SIGSTOP
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多