1つの親に対してCで複数の子プロセスを作成する

土星

そのため、OSクラスのコードに取り組んでおり、プロジェクトでは、コマンドラインでファイルごとに新しい子プロセスを作成し、子から親に情報をパイプする必要があります。Unixのwcユーティリティを再作成することになっています(この部分はすでに処理しました)。

私がこれまでに試したことは次のとおりです。

            for(i=0; i<argcount; i++){
                    int pid;
                    pid = fork();
                    if(pid == 0){
                            /* Child Process */
                            /* Close read pipes */
                            close(l_pipe[0]);
                            close(w_pipe[0]);
                            close(c_pipe[0]);
                            wc(lflag, wflag, cflag, filenames[i]);
                    } else {
                            /* Parent Process for piping */
                            /* Close write pipes */
                            close(l_pipe[1]);
                            close(w_pipe[1]);
                            close(c_pipe[1]);

                            /* Read from pipes */
                            read(l_pipe[0], &buffer, sizeof(count_t));
                            lines+=buffer;

                            read(w_pipe[0], &buffer, sizeof(count_t));
                            words+=buffer;

                            read(c_pipe[0], &buffer, sizeof(count_t));
                            bytes+=buffer;
                    }
            }

ただし、これにより、子の数と同じ数の親が作成されます。これは明らかに間違っています。どこでフォークすべきか正確にはわかりません。私が持っている)、S(子の書込みなど何度でも)、子と親のプロセス間のパイプラインを使用するように、と私は親が(読むために必要があると確信しています。

あなたが提供できる提案をありがとう。

ジョナサン・レフラー

Greg Hewgillが彼の回答提起した問題に加えて、私は次の問題を観察します。

  1. ループフォークを使用して子プロセスを実行し、親部分は単にループの次の反復に戻ることができます。
  2. 次に、パイプから読み取るループができます。
  3. そのループの前に、親プロセスは3つのパイプすべての書き込み終了を閉じます(そうでない場合、パイプにEOFが表示されることはありません)。
  4. パイプから読み取るループは、各パイプを順番に排出するのではなく、各パイプから順番に読み取る必要があります。
  5. 私はあなたが持っていると仮定していますcount_t buffer;—それは変数宣言を示すのに役立ちます。char buffer[sizeof(count_t)]代わりに何らかの問題がある場合は、大小を問わず、あらゆる種類の問題があります。
  6. 現在のスキームで2番目の子が作成されると、パイプの書き込み端がすべて閉じられるため、2番目以降の子は親に何も送信できなくなります。パイプの書き込み端を閉じてループの外側に配置するには、3つの呼び出しを移動する必要があります。
  7. wc関数がパイプを使用できるように、パイプはグローバル変数に含まれている必要があります。これは世界の終わりではありませんが、グローバル変数を避ける方が良い場合がよくあります。これは二次的な問題です。最初に修正する必要のある他のより大きな問題があります。
  8. サイズを個々のファイルに関連付ける必要がある場合は、より多くの簿記を行う必要があります。現時点では、総計のみを集計します。その場合、現在の同期設計が適切である可能性があります。これに失敗すると、1回の操作で子にPIDまたは別のID番号とパイプのカウントを書き込むようになります(操作がアトミックであることを確認するため)。個々の書き込み操作は、パイプの内部バッファーに対して大きすぎない限りインターリーブされません。これは、いくつかの整数では問題になりません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

1つの親プロセスに対して「フォーク」を介して複数のプロセスを作成する

分類Dev

Cを使用して子と親のプロセスを作成する

分類Dev

複数の子プロセスの親プロセスで1つの書き込みストリームのみを使用する

分類Dev

Pythonで1つのファイルに複数のプロセスを使用してログを記録する

分類Dev

同じ親から複数の子プロセスを作成し続ける

分類Dev

2つのパイプを使用して親プロセスと子プロセスの間で通信する

分類Dev

MatLabで1つのハンドルを使用して複数のプロパティにアクセスする

分類Dev

ブーストを使用して、非同期で実行される複数の子プロセスを作成する

分類Dev

Cで親PIDを指定したときにすべての子プロセスのPIDを取得する方法

分類Dev

execファミリ関数の1つを使用して子プロセスを開くと、親へのパイプが子に適用されますか?

分類Dev

Eclipseで複数のプロジェクトに対して1つの戦争を構築する方法

分類Dev

Pythonで1つのx値に対して複数のy値をプロットする

分類Dev

1つのプロットで1つの連続Y変数に対して複数のX変数をプロットする

分類Dev

Ansibleで複数のタスクに対して1つの通知ブロックを定義する

分類Dev

複数のプロセスに対してjavaruntime.exec()を実行する

分類Dev

LinuxでC / C ++を使用して、親プロセスによる子プロセスのCPUとRAMの使用を制限する

分類Dev

複数の操作に対して1つのトリガーを作成する

分類Dev

waitpid()がすべての子プロセスに対して1のみを返すのはなぜですか?

分類Dev

1つのプロセスで複数のcorを同時に並行して使用できますか?

分類Dev

C#で複数の値に対して単一のプロセスを実行するにはどうすればよいですか?

分類Dev

fork()を使用して、C(C ++ではない)で1つの親から3つの子を作成する

分類Dev

cで親プロセスとそのすべての子プロセスを強制終了する方法は?

分類Dev

setuidは1つの子プロセスを作成します

分類Dev

複数の整数に対して1つのforループを作成するにはどうすればよいですか?

分類Dev

複数のビューを作成した後、子のプロパティにアクセスする

分類Dev

親プロセスには複数の子があり、2つの子プロセスには子プロセスがあります

分類Dev

htopは、マルチスレッドを使用せずに、1つのプロセスで使用されている複数のコアを表示します

分類Dev

1つのViewControllerに対して複数のセグエでストーリーボードを使用するにはどうすればよいですか?

分類Dev

1つのアプリIDに対して複数のAPNS証明書を使用する方法は何ですか?

Related 関連記事

  1. 1

    1つの親プロセスに対して「フォーク」を介して複数のプロセスを作成する

  2. 2

    Cを使用して子と親のプロセスを作成する

  3. 3

    複数の子プロセスの親プロセスで1つの書き込みストリームのみを使用する

  4. 4

    Pythonで1つのファイルに複数のプロセスを使用してログを記録する

  5. 5

    同じ親から複数の子プロセスを作成し続ける

  6. 6

    2つのパイプを使用して親プロセスと子プロセスの間で通信する

  7. 7

    MatLabで1つのハンドルを使用して複数のプロパティにアクセスする

  8. 8

    ブーストを使用して、非同期で実行される複数の子プロセスを作成する

  9. 9

    Cで親PIDを指定したときにすべての子プロセスのPIDを取得する方法

  10. 10

    execファミリ関数の1つを使用して子プロセスを開くと、親へのパイプが子に適用されますか?

  11. 11

    Eclipseで複数のプロジェクトに対して1つの戦争を構築する方法

  12. 12

    Pythonで1つのx値に対して複数のy値をプロットする

  13. 13

    1つのプロットで1つの連続Y変数に対して複数のX変数をプロットする

  14. 14

    Ansibleで複数のタスクに対して1つの通知ブロックを定義する

  15. 15

    複数のプロセスに対してjavaruntime.exec()を実行する

  16. 16

    LinuxでC / C ++を使用して、親プロセスによる子プロセスのCPUとRAMの使用を制限する

  17. 17

    複数の操作に対して1つのトリガーを作成する

  18. 18

    waitpid()がすべての子プロセスに対して1のみを返すのはなぜですか?

  19. 19

    1つのプロセスで複数のcorを同時に並行して使用できますか?

  20. 20

    C#で複数の値に対して単一のプロセスを実行するにはどうすればよいですか?

  21. 21

    fork()を使用して、C(C ++ではない)で1つの親から3つの子を作成する

  22. 22

    cで親プロセスとそのすべての子プロセスを強制終了する方法は?

  23. 23

    setuidは1つの子プロセスを作成します

  24. 24

    複数の整数に対して1つのforループを作成するにはどうすればよいですか?

  25. 25

    複数のビューを作成した後、子のプロパティにアクセスする

  26. 26

    親プロセスには複数の子があり、2つの子プロセスには子プロセスがあります

  27. 27

    htopは、マルチスレッドを使用せずに、1つのプロセスで使用されている複数のコアを表示します

  28. 28

    1つのViewControllerに対して複数のセグエでストーリーボードを使用するにはどうすればよいですか?

  29. 29

    1つのアプリIDに対して複数のAPNS証明書を使用する方法は何ですか?

ホットタグ

アーカイブ