2016-03-22 19 views
0

EOF'tan çıkan bir temel kabuk programı yazmaya çalışıyorum ve SIGINT'i bırakmadan işliyorum. İşlevsiz bir c dosyası içinde çalışıyordu ancak fonksiyonlar yaratırken EOF ve SIGNINT'in seg hatalarına neden olabileceği bir hataya rastladım. Buna neyin sebep olduğuna emin değilim ve birisinin benim yapmadığım bir şeyi fark etmesini umuyorum. Aşağıda, soruna neden olduğunu düşündüğüm işlev, Shell'in bir komutu okuduktan sonra (veya sinyalleri uygulayacağım) yaptığı ilk şey.C: Sinyal alındığında Segmentasyon hatası

int check_redirect(char *line, int flag) 
{ 
     int n = 0; 
     if (line == NULL) return (flag); 
     else 
     { 
       do 
       { 
         if (line[n] == '>') flag = 1; 
         n++; 
       }while (line[n] != '\n'); 
     } 

     return (flag); 
} 

Bu fonksiyon denir nerede:

char buffer[15]; 
time_t now = time(NULL); 

strftime(buffer, 15, "[%d/%m %H:%M]", localtime(&now)); 

fprintf(stdout, "%s # ", buffer); 

signal(SIGINT, SIG_IGN); 
read = getline (&line, &len, stdin); 
signal(SIGINT, SIG_DFL); 

flag = check_redirect(line, flag); 

Umarım bu yeterince açık. Bu, bir komutun yürütülmesi için girdi arayan bir ilmiğin başlangıcındadır; komut istemini (tarih ve saat #) basar. Komutlar çoğunlukla çalışırlar, ancak zaman zaman kaybolurlarmış gibi davranırlar, ki bu sinyal işleme hatasıyla ilişkili olabilir.

Şimdiden teşekkürler.

... }while (line[n] != '\n'); 

sadece \n karakteri daha kontrol önerin:

+2

'line' bir satır karakteri yok: – FredK

+0

@FredK Bir EOF karakteri dışında, satır gönderilmez. Eğer bir \ n hattı varsa, bir yönlendirme veya cd komutunun olup olmadığını görmek için denetimlerden geçirilir ve bozulduğu için strtok kullanılarak başka bir yapıya dönüştürülür ve yürütme sistem çağrısında kullanılır – BitFlow

+0

Nerede/nasıl yapılır? ? – ryyker

cevap

0

Seg hatası Burada sonsuz bir döngüye potansiyeline sahip sonsuz döngüye den oluşabilir.

Örneğin, döngüye girmeden önce yeni satırı doğrulamak için strstr(line, "\n"); kullanabilirsiniz.

ne olur
flag = check_redirect(line, flag, read); 
+0

Mesela '\ 0' kontrol uygun olabilir mi? – BitFlow

+0

@BitFlow Evet, bu kullanılabilir. Dizi sonunda sona erecek. – ryyker

+0

Bunu düzeltmiş gibi görünüyor, teşekkürler – BitFlow

0

Değişim

int check_redirect(char *line, int flag, int len) 
{ 
    int n = 0; 
    if (line != NULL) 
    { 
     do 
     { 
     if (line[n] == '>') 
     { 
      flag = 1; 
     } 

     n++; 
     } 
     while ((line[n] != '\n') && (n<len)) 
    } 

    return (flag); 
} 

kodunuzu ile diyoruz?

İlgili konular