2016-03-24 26 views
0

Bash kabuğunu taklit edecek bir program yazmam gerekiyor. Programın ilgili bölümleri burada. Program, EOF'un alımında sona erer (gösterilmiyor). Uygulanacak farklı özelliklerden biri, CTRL-C'ye basıldığında programı sonlandırmamaktır. SIGINT alındığında program yeni bir komut istemi yazdırmalıdır. Mevcut döngü iterasyonunu sona erdirmek için global bir değişkeni değiştiren bir işleyici işlevim ve iç döngüye yeniden girmek için tekrar değiştirecek bir dış döngü var. Ancak, CTRL-C'ye bastığımda program hala çalışmıyor. Bu neden?Sinyal işleme fonksiyonu + göz ardı edilmiyor SIGINT

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<unistd.h> 
#include<time.h> 
#include<signal.h> 
#include<sys/wait.h> 

void SIGINT_handler(int signum); 

static volatile sig_atomic_t endflag = 0; 

int main(int argc, char **argv){ 

    while(1){ 
     endflag = 0; 

     while(!endflag){ 

        struct sigaction action; 

        action.sa_handler = &SIGINT_handler; 
        action.sa_flags = 0; 

        if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){ 
          perror("Failed to set SIGINT handler"); 
          exit(EXIT_FAILURE); 
       } 
     } 
    } 

    return 0; 
} 

void SIGINT_handler(int signo){ 

    if(signo == SIGINT){ 
     endflag = 1; 
    } 
    fflush(stdout); 

} 
+0

kod az ya da çok normal gibi deneyin ana işlevi

girmek hemen sonra

. Derleme sırasında herhangi bir uyarı alır mısınız? Hangi işletim sistemi kullanıyorsunuz? – alk

+0

Bir sinyal kolundan 'stdout' basması iyi bir fikir olmayabilir. Ayrıca küresel bayrağı 'volatile' tanımlaması gerektiğinden şüphe duyuyorum. – alk

+0

İşletim sistemi ve derleyici yüklemeniz gerekiyor, bu Mac üzerinde gcc ve clang ile çalışıyor. – Harry

cevap

-1

Sen

koymak

ana işlevi sinyal işleyicisi işlevi kaydetmek zorunda

(boşluk) sinyali (sigint SIGINT_handler); o Bu

int main(int argc, char **argv){ 

    (void) signal(SIGINT,SIGINT_handler); 

while(1){ 
    endflag = 0; 

    while(!endflag){ 

       struct sigaction action; 

       action.sa_handler = &SIGINT_handler; 
       action.sa_flags = 0; 

       if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){ 
         perror("Failed to set SIGINT handler"); 
         exit(EXIT_FAILURE); 
      } 
    } 
} 

return 0; 

}

+0

"sigaction()" adlı çağrı da bir sinyal işleyiciyi kaydeder. – alk

İlgili konular