ここに簡単なシェルを書いています。簡単に言えば、私はこれらのことをやっています(疑似コード):
call fork()
if return value is zero: //child
setpgid(0,0)
if (foreground)
tcsetpgrp() //give this child access to terminal
reset all signal handlers messed up by parent
unblock all signals that are blocked by parent
execve()
else: //parent
if (foreground)
tcsetpgrp() //give child access to terminal
add this job to job list
unblock all signals
wait for this job to finish
tcsetpgrp() //get terminal access back
if (background)
add this job to job list
unblock all signals
テストしたいのは /bin/cat です。これで、フォアグラウンドで実行すると、このシェルは /bin/cat に対して正常に機能します。ただし、/bin/cat & と入力してバックグラウンドで実行すると、入出力エラーが発生しました。私が学んだことによると、バックグラウンド ジョブが端末から読み取ろうとしている場合、SIGTTIN を送信する必要があります。理想的には、/bin/cat & と入力すると、SIGTTIN によって停止されます。「bg」コマンドを使用して再開すると、SIGTTIN によって再び停止されます。
私が混乱しているのは、これをどのように実装できるかです。SIGTTIN は OS によって自動的に送信されますか、それとも自分で送信する必要がありますか? 後者の場合、子供が端末から読むかどうかをどのように判断できますか?
ありがとう!