web-dev-qa-db-ja.com

Cで作成したカスタムUNIXシェルプログラムにbg、&、fgコマンドの機能を実装するにはどうすればよいですか。

ラボの割り当ての一部として書いたカスタムUNIXシェルの機能を拡張しています。現在、execvp呼び出しによるすべてのコマンド、pwd、cd、履歴、エコー、エクスポートなどの組み込みコマンド、およびリダイレクトとパイプをサポートしています。今、私はバックグラウンドでコマンドを実行するためのサポートを追加したいと思いました。 $ ls -la&また、bgおよびfgジョブ制御コマンドを実装します。

新しい子プロセスをforkし、親プロセスでそれを待たずにコマンドを実行すると、これが実現できることを知っています。しかし、fgを使用してこのコマンドを再びフォアグラウンドにするにはどうすればよいですか?私は、それぞれのバックグラウンドコマンドに、それぞれにシリアル番号を割り当てるリストに入力するというアイデアを持っています。しかし、プロセスをバックグラウンドで実行させてから、それらをフォアグラウンドに戻す方法を知りません。 wait()とwaitpid()システムコールが便利になると思いますが、私はそれらにはあまり慣れていません。私はマニュアルページを読んでみましたが、まだ暗闇の中にあります。誰かが普通の言語でこれをUNIXシステムプログラミングで実現する方法を説明できますか?そして、それはSIGCONTとSIGSTPシグナルと関係がありますか?

4
user1631009

コマンドの一時停止(CTRL-Z)は、SIGTSTPを子プロセスに送信することで機能します。その後、シェルはstdin/stdoutを介してユーザーと自由に対話できます。

再開するには、SIGCONTを子プロセスに送信し、終了するまで待機し続けます。

プロセスのバックグラウンド化は、SIGCONTを送信することで行われますが、notが完了するまで待機します。この場合、シェルと子プロセスの両方がstdout/stderrと対話できますが、stdinは通常、シェルによってインターセプトされます。

バックグラウンドでプロセスを開始するには、fork/execを実行しますが、子プロセスが存在するまでブロックしません。

通常、シェルはSIGCHLDも処理します。これは、親プロセスが終了コードを収集できるように、OSが親プロセスに子プロセスが終了したことを通知する方法です。そうしないと、「ゾンビ」プロセスが発生します。実行されていないが、まだ親によって収集されていないもの。

4
tylerl

W. R.スティーブンスのnix環境での高度なプログラミングの関連する章を読むことをお勧めします。知っておくべき多くの背景情報があり、それが理解できる方法で存在していることを私が確信している唯一の場所です。

0
AProgrammer