Bir sinyal yakalayıcı için
setjmp ve
longjmp oluşumları kullanılarak denetim başka bir yere aktarılabilir. Bkz.
Yerel Olmayan Çıkışlar.
Bir eylemci denetimi dışarı aktardığı zaman, çalışmakta olan yazılım kalan işlemi biteremez. Örneğin yazılım o anda önemli bir veri yapısını güncelliyorsa, veri yapısı belirsiz bir durumda kalacaktır. Süreç sonlandırıldığından belirsizlik daha sonra benzer şekilde bildirilecektir.
Bu sorundan kaçınmanın iki yolu vardır. Biri, önemli veri yapısının güncellenmesi bitene kadar sinyalin engellenmesidir. Bkz.
Sinyallerin Engellenmesi.
Diğer yol ise, önemli veri yapısını eylemci içinde yeniden ilklendirmek ve değerlerini belirli yapmaktır.
Örnekte, bir genel değişkenin yeniden ilklendirilmesi gösterilmiştir:
#include <signal.h>
#include <setjmp.h>
jmp_buf return_to_top_level;
volatile sig_atomic_t waiting_for_input;
void
handle_sigint (int signum)
{
/* Sinyal alındığında girdi için beklemeliyiz, ama denetimi
aktaracağımızdan artık bekleyemeyiz. */
waiting_for_input = 0;
longjmp (return_to_top_level, 1);
}
int
main (void)
{
...
signal (SIGINT, sigint_handler);
...
while (1) {
prepare_for_command ();
if (setjmp (return_to_top_level) == 0)
read_and_execute_command ();
}
}
/* Bunun çeşitli komutlar için kullanılan bir yordam
olduğunu hayal edin. */
char *
read_data ()
{
if (input_from_terminal) {
waiting_for_input = 1;
...
waiting_for_input = 0;
} else {
...
}
}