シェル(Linux、GCC、C言語)を実装するコードを書きましたが、すべて動作しますが、ヒストリオプションを追加したときに何らかの理由でコードがクラッシュします: 本当に't(他のコード)なので、ここでは必要なものだけを入れます。シェルの実装の履歴はセグメンテーションエラーを受け取ります
問題は、履歴に保存する必要がある古いコマンドの後にquit
と入力したときに、終了入力するとセグメンテーションフォルト(コアがダンプされた)で破棄されるだけです。
履歴は、リンクされたリスト、コマンドの文字列、次のノードのノードの構造体に保存されます。また、ヘッドをメインに保存しました。ポイントは最後のコマンドを15個だけ保存したいのですが、他のコマンドは気にしないので、リストを印刷するたびにループの最初の15個のノードに移動しました。
私はGDBでデバッグするとき、私は彼が歴史が、現在のラインが本当に歴史に関連していない最初のコマンドを追加した後の行のコードがクラッシュしたラインであることを見た:
メイン:
int main()
{
history_ll* top;
char userInput [CHOICE_LENGTH];
char buff[PATH_MAX];
int flag=1;
cmdLine * head;
while (flag)
{
getcwd(buff, PATH_MAX);
printf("%s:~$ ",buff);
fgets(userInput,MAX_INPUT, stdin);
userInput[strlen(userInput)-1]=0;
historyAdder(userInput,&top);
if(strcmp(userInput,QUIT_OPTION)==0) //segmentation fault here!
{
flag=0;
}
else
{
//doesn't matter
}
}
return 0;
}
historyAdderは次のようになります。
void historyAdder(const char *command,history_ll** top)
{
history_ll* node;
strcpy(node->command,command);
node->command[strlen(command)]=0;
if(historyLength!=0)
{
node->next= *top;
}
else
{
node->next= NULL;
}
*top = node;
historyLength++;
}
注:historyLengthはグローバル変数
01ですこれは構造体である:
typedef struct history_ll{
char command[CHOICE_LENGTH];
struct history_ll *next;
}history_ll;
はあなたのヘルパーをありがとう!