pthreads(7)
POSIX.1'in bir işlem paylaşım özniteliğindeki tüm iş parçacıkları gerektirdiğini açıklar:
POSIX.1 ayrıca, her iş parçacığı için bazı özniteliklerin farklı olmasını gerektirir , örneğin:
Linux çekirdeği complete_signal
rutini aşağıdaki kod bloğuna sahiptir - yorumlar oldukça kullanışlıdır:
/*
* Now find a thread we can wake up to take the signal off the queue.
*
* If the main thread wants the signal, it gets first crack.
* Probably the least surprising to the average bear.
*/
if (wants_signal(sig, p))
t = p;
else if (!group || thread_group_empty(p))
/*
* There is just one thread and it does not need to be woken.
* It will dequeue unblocked signals before it runs again.
*/
return;
else {
/*
* Otherwise try to find a suitable thread.
*/
t = signal->curr_target;
while (!wants_signal(sig, t)) {
t = next_thread(t);
if (t == signal->curr_target)
/*
* No thread needs to be woken.
* Any eligible threads will see
* the signal in the queue soon.
*/
return;
}
signal->curr_target = t;
}
/*
* Found a killable thread. If the signal will be fatal,
* then start taking the whole group down immediately.
*/
if (sig_fatal(p, sig) &&
!(signal->flags & SIGNAL_GROUP_EXIT) &&
!sigismember(&t->real_blocked, sig) &&
(sig == SIGKILL || !p->ptrace)) {
/*
* This signal will be fatal to the whole group.
*/
Yani, sinyallerin nereye gönderileceğinden sorumlu olduğunuzu görüyorsunuz :
İşleminiz bir sinyalin eğilimini SIG_IGN
veya olarak ayarladıysa, sinyal SIG_DFL
tüm iş parçacıkları için göz ardı edilir (veya varsayılan - kill, core veya ignore).
Prosesiniz bir sinyalin düzenini belirli bir işleyici rutinine ayarladıysa, hangi iş parçacığının belirli iş parçacığı sinyal maskelerini kullanarak sinyalleri alacağını kontrol edebilirsiniz pthread_sigmask(3)
. Hepsini yönetmek için bir iş parçacığı atayabilir veya sinyal başına bir iş parçacığı oluşturabilir veya belirli sinyaller için bu seçeneklerin herhangi bir karışımını oluşturabilir veya Linux çekirdeğinin sinyali ana iş parçacığına iletme şeklindeki mevcut varsayılan davranışına güvenebilirsiniz.
Bununla birlikte, bazı sinyaller signal(7)
man sayfasına göre özeldir :
Bir bütün olarak bir işlem için (örneğin, kill (2) kullanılarak gönderildiğinde ) veya belirli bir iş parçacığı için (örneğin, yürütmenin bir sonucu olarak üretilen SIGSEGV ve SIGFPE gibi belirli sinyaller ) bir sinyal üretilebilir (ve dolayısıyla beklemede) pthread_kill (3) kullanarak belirli bir evreyi hedefleyen sinyaller gibi, belirli bir makine dili talimatı iş parçacığına yöneliktir
. İşleme yönelik bir sinyal, şu anda bloke edilmiş sinyale sahip olmayan ipliklerin herhangi birine gönderilebilir. Evrelerin birden fazlasının sinyali engellenmemişse, çekirdek, sinyali iletmek için rastgele bir evre seçer.