私は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#)を出力したコマンドを実行するための入力を探しているループの先頭です。コマンドは主に機能しますが、時々失われたかのように動作します。この信号処理エラーに関連すると思われます。
ありがとうございます。
'line'は改行文字を持っていない場合はどうなりますか? – FredK
@FredK EOF文字の場合を除いて、行は送信されません。 \ n行がある場合は、リダイレクトまたはcdコマンドかどうかを調べ、strtokを使用して分解して実行システムコールで使用するようにチェックします。 – BitFlow
/howは '行が作成される場所? – ryyker