我很好奇我是否可以使用unistd c函数执行以下操作alarm(int signal)
创建我的主....并为每个线程帽创建用函数初始化SIGALRM,在激活的情况下应该关闭我的线程。这可能吗?或1 SIGALRM / main仅合法?
答案 0 :(得分:2)
好的,首先,alarm()
实际上是一个 unsigned int值,它是它到期前的秒数。因此,您的示例int signal
不是alarm()
的正确实现,仅仅是FYI。
就此而言:
for each thread that is created to initialization a SIGALRM
生成的SIGALRM
是针对进程而不是每个线程完成的,所以你必须捕获警报并有一些内部策略来知道你为它提出了哪个线程并处理它因此。一旦有了处理程序,就可以一遍又一遍地发出警报,但请记住:
报警请求未堆叠;
所以你必须一次做这个。它仍然是可能的,但并不像你希望的那样完全向前发展。
对于我正在谈论的非常粗略的例子:
alarm(10)
alarm(0)
来终止警报,调用alarm(3)
然后注意到一旦关闭它需要调用alarm(7)
来完成线程1的休眠时间答案 1 :(得分:2)
进程中的每个线程都有一个独立的信号掩码 表示线程当前阻塞的信号集。一个 线程可以使用pthread_sigmask(3)操纵其信号掩码。在一个 传统的单线程应用程序,sigprocmask(2)可以用来 操纵信号掩码。
来自man 7的信号。
问题是警报每个进程都有效,而不是每个线程,所以如果线程的sigmask是相同的,你真的不知道哪一个会收到信号。