2011-10-10 17 views
1

フォアグラウンドとバックグラウンドプロセスでシェルを作成しようとしています。フォアグラウンドプロセスがターミナルにアクセスしようとすると、ターミナルにアクセスできないため、 。何が起こる は、最初は、私は、私がフォアグラウンドプロセスとバックグラウンドプロセスで問題が発生しました

に戻って上記の無視信号を置くために子供を設定

SIGTSTP 
SIGINT 
SIGTTOU 

両方フォアグラウンドとバックグラウンドプロセスの子のために、フォークした後の信号を無視するように、私のシェルを設定することです

SIG_DFL 

さらに、各子供について、私はまた、それらが異なるプログラムグループにあるように、彼らのpgidsを設定します。

tcsetpgrp(STDIN, getpgid(getpid())) 
tcsetpgrp(STDOUT, getpgid(getpid())) 

また、フォアグラウンドプロセスの親もの子を待ち:

私は、前景と背景のプロセスの親の間で持っている違いがフォアグラウンドに、私はまた、子端末のアクセス権を与えるということです完了する前にループバックし、ユーザーのプロンプトを再度要求します。背景の子のために

、親はちょうどループへ

continue 

をコールバックし、より多くのユーザープロンプトを求めます。さらに、バックグラウンドプロセスがゾンビにならないようにwaitpid()行を持つSIGCHLDシグナルのハンドラも用意しています。

問題:私が実行している問題は、バックグラウンドプロセスがまだ端末にアクセスできていることです(バックグラウンドプロセスでecho "hello"を使用しています)。また、フォアグラウンドプロセスは生成されたシグナルを無視しているようですCTL + CとCTL + Zによって、前景の子供だけでなく、背景の子供でもそれらを再び有効にしました。 何が間違っているかのヒントはありますか?

答えて

0

"通常の"シェルは機能しません。フォアグラウンドプロセスは子プロセスではありません。その後、子セット信号、近くに継承されたすべてのファイルディスクリプタ、setprgp(TTYを制御か​​ら切り離し)、I/Oリダイレクションのために開いているファイルに

を必要に応じて、

  • フォーク・バックグラウンド・プロセス:したがって、私はこのようにそれを行うだろう親で

  • 、あなたは子プロセスを待つか、単にそれらを無視するかどうかを決定(SIG_CHLD)