2

ここに簡単なシェルを書いています。簡単に言えば、私はこれらのことをやっています(疑似コード):

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 によって自動的に送信されますか、それとも自分で送信する必要がありますか? 後者の場合、子供が端末から読むかどうかをどのように判断できますか?

ありがとう!

4

1 に答える 1

0

最後にそれを手に入れました。SIGTTIN への応答がないのは、親がこのシグナルを無視したためです。child では、SIGTTIN シグナルを含むすべてのシグナル ハンドラーをデフォルトに設定する必要があります。

于 2012-10-27T21:09:51.157 に答える