Yoshiki-Iwasa / minishell

0 stars 0 forks source link

$ ls ctrl+\ [Enter]の動作相違 #50

Closed hiroin closed 4 years ago

hiroin commented 4 years ago

事案 $ ls ctrl+\ [Enter]の動作相違

miishellのver 0a2a3807992ab3f054ab49c5c1e59365abf08e0e

事案詳細 $ date ctrl+\ [Enter] とした場合、bashはdateが実行されるが、minishellは実行されない

[bash]

$ date ctrl+\ [Enter]
dimanche 6 septembre 2020, 14:09:43 (UTC+0200)
$

[minishell]

minishell$ date ctrl+\ [Enter]
minishell$
Yoshiki-Iwasa commented 4 years ago

Ctrl + \ で送られるシグナルを無視するよう設定してもなぜかCtrl + \ までの入力が消えちゃうんですよね(^^ ;)

これに関しては、解決策がわからなかったのでtratail に質問しました。 https://teratail.com/questions/290080

Yoshiki-Iwasa commented 4 years ago

修正コミットしましたが、ミスです

Yoshiki-Iwasa commented 4 years ago

https://teratail.com/questions/290080

この回答を見る限り、入力キューのクリアをSIGQUITだけ無効にするのは難しそうです。 stty noflush を使ってしまうと、SIGINT も同時にクリア無効になってしまうので、以下のような動作祖語が起きます

minishell$ ls ^C
minishell$ exit [Enter]
ls: exit: No such file or directory

つまり、バッファ管理をしないとこの機能は実装できないのではないですかね。。。。 SIGQUIT だけ noflush が適用できないかもう一度teralia で聞いてみます

hiroin commented 4 years ago

回答をくれた方が、Linux、bash、Apache総合1位なんですね…、すごいな…詳しいな… 割り込みを発生させる入出力キューがクリアされること、キューを制御するには、termiosかsttyをいじる必要があること、しかしnoflushにすると、Ctrl + Cしたときにもキューがクリアされないことによる齟齬が発生することを理解しました。 bashは、おそらくデフォルトの入出力キューとは違う仕組みのキューを持っているのかなと想像しました。少なくともread関数だけでは実装できないので、諦めましょう。 レビューのときには与えられている関数だけでは実装が不可能であることを予め説明しておきましょう。 課題の意味は、signal関数を使って、ちゃんとSYGQUIT送れているか?で、コマンドの途中でCtrl + \したときに、「何も起きない」ことの確認ができるので、この件はそのままの実装でいきましょう。 closeいたします!