Bir sinyal eylemci çalışmaya başladığında çalışmasının başka bir sinyal ile kesilmesini istemezsiniz. Eylemci çalışmaya başlayıp, işini bitirene kadar çalışmasının ya da verisinin bozulmaması için sinyalleri engellemelisiniz.
Bir eylemci işlev bir sinyal ile çalıştırıldığında bu sinyal (ve sürecin sinyal maskesindeki diğer sinyaller) özdevinimli olarak engellenir. Örneğin, SIGTSTP sinyali için bir eylemciniz varsa, bu eylemci çalışmaya başlayınca daha sonra gelen SIGTSTP sinyalleri eylemcinin çalışması süresince bekletilecektir.
Bununla birlikte, öntanımlı olarak, diğer çeşit sinyaller engellenmez ve eylemcinin çalışması sırasında gelebilirler.
Eylemcinin çalışması sırasında gelen farklı sinyalleri engellemenin en güvenilir yolu sigaction yapısının sa_mask üyesini kullanmaktır.
Bir örnek:
#include <signal.h>
#include <stddef.h>
void catch_stop ();
void
install_handler (void)
{
struct sigaction setup_action;
sigset_t block_mask;
sigemptyset (&block_mask);
/* Eyelmci çalışırken uçbirimden kaynaklanan sinyaller engellensin */
sigaddset (&block_mask, SIGINT);
sigaddset (&block_mask, SIGQUIT);
setup_action.sa_handler = catch_stop;
setup_action.sa_mask = block_mask;
setup_action.sa_flags = 0;
sigaction (SIGTSTP, &setup_action, NULL);
}
Bu, diğer sinyallerin eylemciyi kesintiye uğratmasının engelleminin daha güvenilir bir yoludur. Ancak, sinyalleri eylemci içinden doğrudan engellerseniz, eylemcinin başlangıcında kısa bir süre için bu engelleme etkin olmayacaktır.
Bu mekanizma ile sürecin sinyal maskesinden sinyalleri kaldıramazsınız. Bununla birlikte, eylemci içinden yapacağınız sigprocmask çağrıları ile bazı sinyalleri engelemeyi ya da engellememeyi tercih edebilirsiniz.
Her durumda, eylemci işini bitirdiğinde sistem, eylemcinin çalışmaya başladığı andaki duruma geri dönecek ve bekletilen sinyaller varsa bu sinyaller gönderilecektir.