に関する背景のプロセスをfork()を子プロセスでマダミシェル
-
25-10-2019 - |
質問
私が作り出してしまおうというもの簡易なシェルプログラムC.私が必要とすることができるようになりますがユーザに提供し、迅速にできる他の地域です。によって全然違いますが、使用フォーク()を親プロセスを待つ()の子どもの子どもexecvp()'sのプログラム。
ただし、'&'の文字が追加されるのは、ユーザのコマンドについては親権者の方の同意が必要そのプログラムの背景、意味さんありがとうございます。親を待機しませんの子プロセスではなく直ちに返還し、速やかに、ユーザーがあるが、バックグラウンド処理で実行していくもないと何も表示画面に表示します。うにしていきたいと考えていくかどうか確認してくださいがいよpsコマンドです。
う概念を理解し使用するフォーク()を子ども、その後の子どもフォーク()を再度作成の孫、その後直ちに口()グループの決まります。すなわち孤児のたのでしょう。はずのことを親が待ちの子供の子供の準備終了時ではないかないんで待つのでしょうか?もゾンビ狂気?わかりません。多くのサイトをいくようお勧めしこの方法としての実行過程の背景になります。
しかし、私がいこうかいじゅうたちのいるところでの流れプログラムの背景にももっと世界に目を向けて表示入力の画面では、と思っていない場所になっていくことになるでしょう。
これが私の実装のコードは、私は非常に間違っています。私は迷ったらこの全体の孫ものであっても、ルートが必要で、その場合、どうしたの私のコードについて教えてください。
36 int main(int argc, char *argv[])
37 {
38 char buffer[512];
39 char *args[16];
40 int background;
41 int *status;
42 size_t arg_ct;
43 pid_t pid;
44
45 while(1)
46 {
47 printf("> ");
48 fgets(buffer, 512, stdin);
49 parse_args(buffer, args, 16, &arg_ct);
50
51 if (arg_ct == 0) continue;
52
53 if (!strcmp(args[0], "exit"))
54 {
55 exit(0);
56 }
57
58 pid = fork(); //here I fork and create a child process
61
62 if (pid && !background) //i.e. if it's the parent process and don't need to run in the background (this is the part that seems to work)
63 {
64 printf("Waiting on child (%d).\n", pid);
65 pid = wait(status);
66 printf("Child (%d) finished.\n", pid);
67 }
68 else
69 {
70 if (background && pid == 0) { //if it's a child process and i need to run the command in background
71
72 pid = fork(); //fork child and create a grandchild
73 if (pid) exit(0); //exit child and orphan grandchild
74
75 execvp(args[0], args); //orphan execs the command then exits
76 exit(1);
77
78 } else exit(0);
79 }
80 }
81 return 0;
82 }
P.S. ている場合がありますさんありがとうございます。処理をしているところバックグラウンドで実行中のすことは一切ございませんの音を再度なので、無限ループの印刷諸表にあります。ていただきたいと思いことを確認してくださいものバックグラウンドで実行中のよps-aはい。
ごめんな混乱の説明だけでなのかは説明できない。
かまいません。
P.P.S う徹底することでそれぞれ次のコマンドを決定するboolean値'background'、申し訳ありませんの混乱
解決
ません使用したいのですが、ダブル-fork()
方法は、シェルは書き込み非常にシンを特異的にから逃げるための監督によるシェルが走ります。
ではなく、複製行為の &
既存性が電話 fork()
, その後、児童話 setpgid(0, 0);
入れ子の新しい プロセスグループ.親だけが続くもとのアイコンをクリックしても同じ PID
子どものでない話 wait()
.
各端末でのみとなっていforegroundプロセスグループは、プロセスグループが現在許可を送への出力端子です。このままのプロセスグループのあるシェル委員、自分の殻のままに、手前
の場合バックグラウンド処理グループ読み込もうとし端末から、送信を停止します。への出力端子がいまだあまり ls &
お通常のシェル).実施のため fg
コマンドシェルが必要になりま tcsetpgrp()
の変更機能のフォアグラウンドプロセスグループ.
いても知りたい方は電話 waitpid()
の WNOHANG
オプションを定期的に、例えば、直前に表示シェルの力します。ることができまを検出するためのバックグラウンド処理が終了または停止ますので、処理することができますの SIGCHLD
信号).