2017-10-26 7 views
-1

私の目標は、指定したディレクトリをスキャンし、処理する.csvファイルを探すことができるように "ls"関数を実装することです。今私の考えは、ls関数を使ってcsvファイルが検出されるたびにfork()を使って子プロセスを作成することですが、これを行う方法は非常に混乱しています。私はgeeksforgeeksのfork()ページを読んでおり、csvファイルが検出されるたびにforkを呼び出すと、子プロセスは2を掛け続けますか?そして、フォークステートメントに私の処理コード全体をラップする必要がありますか?別の子を作成する前に各子プロセスが完了するのを待っていたら、それは多重処理ではありません。私はまだC言語を学んでいますが、fork関数が実際にどのように機能するのかを理解するのは難しいです。どんな助けでも大歓迎です、ありがとうございます。 pidの戻り値を使用すると、親または子で継続しているかどうかを区別するために使用されるディレクトリをスキャンして特定のファイルを同時に処理する

while(d = readdir(fd) { 
    if (iscsv(d->d_name)) { 
     int pid = fork(); 
     switch(pid) { 
     case 0: // Child process 
      process_csv(d->d_name); 
      exit(0); 
      break; 
     case -1: // Error 
      perror("fork"); 
      exit(1); 
      break; 
     default: // Parent 
      printf("Forked PID %d to process %s\n", pid, d->d_name); 
    } 
} 

+2

'fork'呼び出しで作成された子プロセスは、ディレクトリの検索を続行してはならず、ファイルを処理してから' exit'する必要があります。あなたがちょっと検索するならば、おそらく何百万ものインターネット上での 'fork'(スタックオーバーフローを含む)の使い方の例があります。 –

+0

ファイルごとに新しいプロセスをforkする理由を教えてください。これは、あなたが何をしているのかを行うための高価な方法です。 'fork()'を使ってあなたを運動させることが目的なら、それは一つのことです。もしあなたが真剣な仕事をしようとしているなら、それはまったく別のものです。子プロセスがexec 'ls'を処理すると、プロセスが爆発することはありません。毎回2倍にはなりません。 –

+0

forkを呼び出した後、戻り値をチェックします。 '0'が返ってきた場合、あなたは子供の中にいるので、ファイルを処理してループを続行せずに終了する関数を呼び出します。ゼロ以外の値を返す場合は、まだ親プロセスにあるので、スキャンを続行します。 – Barmar

答えて

0

基本的な構造は次のようになります。子プロセスはファイルを処理して終了し、親プロセスはループを続けます。したがって元の親だけがループとフォークを保持するので、倍化プロセス(fork bomb)を保持しないでください。

+0

wait()システムコールを追加して、別の子プロセスをフォークする前に子プロセスが実行されていることを確認してください。 – codemonkey

+0

すべての処理を同時に実行する必要はありません。それが子プロセスでそれを行う理由ですね。 – Barmar

関連する問題