2016-03-22 16 views
0

私はEOFで終了し、終了せずにSIGINTを処理する基本シェルのプログラムを作成しようとしています。無機能のcファイル内で動作していましたが、関数を作成すると、EOFとSIGNINTがsegフォルトを引き起こすエラーが発生しました。私はこれを引き起こしていることが分かりませんし、誰かが私がしなかったものにスポットを当てることを望んでいます。以下は、私が問題を引き起こしていると思う機能です。シェルがコマンドを読み込んだ後に最初にやったことです。C:シグナルが受信されたときのセグメンテーションエラー

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); 
} 

関数が呼び出される場所です:

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); 

がうまくいけば、これは十分に明確です。これは、プロンプト(dateとtime#)を出力したコマンドを実行するための入力を探しているループの先頭です。コマンドは主に機能しますが、時々失われたかのように動作します。この信号処理エラーに関連すると思われます。

ありがとうございます。

+2

'line'は改行文字を持っていない場合はどうなりますか? – FredK

+0

@FredK EOF文字の場合を除いて、行は送信されません。 \ n行がある場合は、リダイレクトまたはcdコマンドかどうかを調べ、strtokを使用して分解して実行システムコールで使用するようにチェックします。 – BitFlow

+0

/howは '行が作成される場所? – ryyker

答えて

0

ワンセグ障害は、あなたがここに無限ループの可能性を持っている無限ループ から発生する可能性があります。

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

はちょうど\n文字以上のチェックを提案します。

たとえば、ループを入力する前に改行が存在することを確認するには、strstr(line, "\n");を使用できます。

+0

'\ 0'チェックが適切でしょうか? – BitFlow

+0

@BitFlowはい、これを使用できます。文字列は最終的に終わります。 – ryyker

+0

これは修正されたようですが、ありがとう – BitFlow

0

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); 
} 

はでそれを呼び出すようにコードを変更し

flag = check_redirect(line, flag, read); 
関連する問題