私は自分のシンプルなシェルを書いています。私がする必要があることは、シェルに残り、ctrl + cが押されたときに新しい行にプロンプトを表示するだけで、SIGINTシグナルを制御することです。現在、私はシグナルを処理することができ、シェルは単にプロンプトの後に^C
を表示します。ただし、カーソルは同じ行に残ります。私が代わりにしたいのは、プロンプトの後にシェルプリント^C
を入れ、次の行に移動し、新しいプロンプトを表示します。私自身のシェルを書く - Ctrl + C(SIGINT)を正しく処理することの問題
正確に同じ問題に対処するthis questionが見つかりました。私の問題は、私のmain
がプロンプトループが実行される別の機能を呼び出すことです。上記のリンク上で、メインとプロンプトのループ機能の両方で解決策を実装しようとすると、多くの異なる方法を試しましたが、すべては不運です。ここに私のコードは、これまでのところです:
main.cの
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "MyShell.h"
void ctrl_C_handler();
int main(int argc, char **argv) {
signal(SIGINT, ctrl_C_handler);
my_shell_loop();
return EXIT_SUCCESS;
}
void ctrl_C_handler() {
//Catches the SIGINT signal fine without anything happening in this function
//I cannot figure out how to have MyShell print a fresh prompt on a new line
//after ctrl+C is pressed
}
MyShellLoop.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "MyShell.h"
char *get_time();
void my_shell_loop() {
char *line;
char **args;
int status;
char *prompt = (char *) malloc(17);
do {
strcpy(prompt, get_time());
strcat(prompt, " # ");
printf("%s", prompt);
line = read_command();
args = split_command(line);
status = execute_command(args);
free(line);
free(args);
} while (status);
free(prompt);
}
EDIT
使用:
void ctrl_C_handler() {
signal(SIGINT, ctrl_C_handler);
printf("\n");
my_shell_loop();
}
は、ctrl + cが最初に押されたときに機能しますが、それ以降は押されたときのように動作します。
"issue"という名前のものは実際に表示されません。空の入力で1回のループ反復を実行するだけです。はい、コードの重複を避けるために、要素を並べ替える必要があります。 @EugeneSh。 –
。それも私が思いついた1つの解決策でしたが、ユーザーの入力がなくてもループを実行することはできませんでした。どうすればこれを達成できますか? – KOB
ループの内容を別の関数に取り込みます。あるいは、入力用に1つ、出力用に2つに分かれています。次に出力用に呼び出します。 –