フォアグラウンドとバックグラウンドプロセスでシェルを作成しようとしています。フォアグラウンドプロセスがターミナルにアクセスしようとすると、ターミナルにアクセスできないため、 。何が起こる は、最初は、私は、私がフォアグラウンドプロセスとバックグラウンドプロセスで問題が発生しました
に戻って上記の無視信号を置くために子供を設定SIGTSTP
SIGINT
SIGTTOU
両方フォアグラウンドとバックグラウンドプロセスの子のために、フォークした後の信号を無視するように、私のシェルを設定することです
SIG_DFL
さらに、各子供について、私はまた、それらが異なるプログラムグループにあるように、彼らのpgidsを設定します。
tcsetpgrp(STDIN, getpgid(getpid()))
tcsetpgrp(STDOUT, getpgid(getpid()))
また、フォアグラウンドプロセスの親もの子を待ち:
私は、前景と背景のプロセスの親の間で持っている違いがフォアグラウンドに、私はまた、子端末のアクセス権を与えるということです完了する前にループバックし、ユーザーのプロンプトを再度要求します。背景の子のために
、親はちょうどループへ
continue
をコールバックし、より多くのユーザープロンプトを求めます。さらに、バックグラウンドプロセスがゾンビにならないようにwaitpid()行を持つSIGCHLDシグナルのハンドラも用意しています。
問題:私が実行している問題は、バックグラウンドプロセスがまだ端末にアクセスできていることです(バックグラウンドプロセスでecho "hello"を使用しています)。また、フォアグラウンドプロセスは生成されたシグナルを無視しているようですCTL + CとCTL + Zによって、前景の子供だけでなく、背景の子供でもそれらを再び有効にしました。 何が間違っているかのヒントはありますか?