Linux sinyallerinde yeni çıkıyorum, lütfen yardım edin. Aşağıdaki kod Linux 2.6 gcc'de çalıştırıldığında çekirdek dökümü alır.Sinyal SIGFPE soru
$ ./a.out
Kayan nokta özel durumu (çekirdek döküldü)
sorular:
1. Bir süreç sinyal maskesi takılı olduğundan, olmamalı hattı tarafından üretilen "SIGFPGE" 40 (z = x/y) engellenmeli mi?
2. Bir sinyal işleyicisi kurulduğundan, engellenmemişse, "SIGFPE" bir çekirdek dökümü yerine sinyal işleyici tarafından yakalanmamalıdır?
3. Eğer satır 40'ı (z = x/y) yorumladıysanız ve bunun yerine satır 42'yi (yükselt (SIGFPE)) kullanırsam, her şey beklediğim gibi çalışır. X/0 ile SIGFPE arasındaki fark nedir? Burada
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sig_handler(int signum)
{
printf("sig_handler() received signal %d\n", signum);
}
int main(int argc, char * argv[])
{
// setup signal mask, block all signals
sigset_t set;
sigfillset(&set);
if(sigprocmask(SIG_BLOCK, &set, NULL)<0)
{
perror("failed to set sigmask");
return -1;
}
// install signal handler for SIGFPE
struct sigaction act;
act.sa_handler = sig_handler;
act.sa_mask = set;
act.sa_flags = 0;
if(sigaction(SIGFPE, &act, NULL)<0)
{
perror("sigaction failed");
exit(-1);
}
volatile int x =1;
volatile int y =0;
volatile int z = x/y;
//raise(SIGFPE);
printf("point 1000\n");
return 0;
}
+1. En son spesifikasyon [Sayı 7] olmasına rağmen (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html). :-) – Nemo
@Nemo: Teşekkürler. Kural hâlâ orada, ancak sözcük biraz değişti, bu yüzden cevabımı güncelledim. –
Cevaplar için teşekkürler. "Tanımsız" dan nefret ediyorum. –