0

以前の質問[ここ][1]に続いて、複数のファイルの行数を計算したいと思います。各ファイルに、プロセス、その問題の子プロセスを配置しcalculateLines、自分のメソッドを実行します。 file、およびそのファイルの行数を見つけます。

私はfork()システムコール(と呼ばれるmy_fork())として書きました、そしてここにコードがあります:

 int main(int argc, char *argv[])
 {

     typedef struct fileChild {
       pid_t processID;
       char *fileName;
       int processFileLines;
     }  child;


     child children[argc];        // array of children

     int n = 0;   // using this to tell how much lines in a single file
     int i = 0;   // using this to iterate the number of files
     char dig;    // using this to convert into char the number of lines

     while (i < argc )
     {
         children[i].processID = my_fork();  // create process 'i' for file 'i'
         children[i].fileName = argv[i];
         children[i].processFileLines = calculateLines(children[i].fileName);
     }

     ....
     ....

     return 0;
 }

私の質問:これは、サブプロセスが自分のファイル(file i)の行数をチェックする方法ですか?
これ(フォーク)によってコードがどのように改善されるかわかりません...気楽に行ってください。プロセスを操作するのはこれが初めてです。

最終版:

#include <stdio.h>

 typedef unsigned int size_t;
 typedef signed ssize_t;

 int main(int argc, char *argv[])
 {



     char myArray[15];


     int n = 0;
     int i = 0;
     pid_t pid;


     for (i = 1; i < argc; i++)
     {

         if ((pid = my_fork()) == 0)

         {
             n = calculateLines(argv[i]);
             sprintf (myArray, "\nfile%d: %d \n", i,n);
             my_write(1,myArray,15);

         }
        else if (pid < 0)
            break;

     }

     return 0;
 }

ターミナルでのテスト:

a@ubuntu:~/Desktop$ ./ProjOsFInal somefile.txt about.html epl-v10.html
a@ubuntu:~/Desktop$ 
file2: 300 

file1: 133 

file3: 327 

file2: 300 

file3: 327 

file3: 327 

file3: 327 
4

2 に答える 2

1

編集:これは、リビジョンとフォームの変更を反映するように編集されます

fork()は、作成した子のプロセスIDを返します。作成された子の場合は、0を返します。したがって、これを使用して、あなたがより多くのフォークを必要とする親であるか、行を数えるのに忙しいはずの子であるかを区別できる場合。

私があなたを正しく理解しているなら、fileNameなどのローカル変数を設定した後にフォークしたいと思うでしょう。簡単な例を次に示します。

const char *local_filename;
pid_t f;
int i = 0;
while (i < argc) {
  i++;
  local_filename = argv[i];
  f =  my_fork();
  if (f == 0) { // fork() returns 0 if we are a child, so we want to be a child prcess here
    calculate stuff;
    ...
    break; // Since we're a child we don't want to go on and spawn more, so we exit the loop and are done
  }
}
于 2012-04-23T01:45:31.517 に答える
1

コードを少し単純化できると思います。あなたが抱えている問題の1つは、現在処理していることですargv[0]。これは、引数ではなくプログラムの名前です。

int main(int argc, char **argv)
{
    pid_t kids[argc];   // VLA
    int n_kids = 0;

    for (int i = 1; i < argc; i++)
    {
        pid_t pid;
        if ((pid = my_fork()) == 0)
        {
            be_childish(argv[i]);
            /*NOTREACHED*/
            exit(EXIT_FAILURE);
        }
        else if (pid < 0)
            break;
        else
            kids[n_kids++] = pid;
    }
    int status;
    while ((pid = waitpid(-1, &status, 0)) > 0)
        n_kids = note_death_of_child(pid, status, n_kids, kids);
    return(0);
}

このnote_death_of_child()関数は、リスト内のエントリを見つけるだけです。実際には、ここに子のリストは必要ありませんが、各子が終了するときに、その終了ステータスが何であるかをメモできます。

関数にはファイルのbe_childish()名前が付けられます。ファイルを開き、読み取り、閉じ、書き込む必要のあるものをすべて書き込み、終了します。exit()関数のループ内への呼び出しはmain()、誤って実装された幼稚な関数に対する防御メカニズムとして存在します。

于 2012-04-23T03:36:38.687 に答える