2017-02-19 11 views
-1

私はCプログラミングを初めて行ったので、この実装上の問題が発生しました。状況は私が./abc.c RR GG EE WW BB CC DD AA、子プロセス1は、RR BBを格納して印刷する必要があり、子プロセス2は格納し、印刷するべきである場合は、とコマンドライン引数をラウンドロビン方式で印刷する4つの子プロセスを作成するためにfork()を使用する必要があります。そうです。最終的な出力は次のようになります。Cコマンドライン引数をラウンドロビン方式で出力して保存します

Child 1, pid 23460: S5 HT DK S4 H7 S6 S8 D2 H3 H2 DT DA S9 
Child 2, pid 23461: C7 HA D6 S7 SQ HK H6 H4 C3 CK S2 C9 SJ 

3番目と4番目の子プロセスの出力が似ています。

問題は店舗の部分です。どのようにこれらの引数を適切に保存し、上記の出力を生成するためにprintfまたは他の方法を使うことができますか? 1つの子プロセスが1行を出力します。私は解決策を理解できません。

ストア要件は、子要素1を格納することです。配列は配列です。 S5 HT DK S4 H7 S6 S8 D2 H3 H2 DT DA S9、子要素2を配列に格納します。 C7 HA D6 S7 SQ HK H6 H4 C3 CK S2 C9 SJなど。

ここで私はこの時点で何を得ているのですか?

#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 

void childFunction(char *argv[], int identify){ 
    int i; 
    for (i=1;i<sizeof(argv);i+=4){ 
     switch (identify){ 
     case 0: 
      printf("Child : %d %s\n", identify+1, argv[i]); 
      break; 
     case 1: 
      printf("Child : %d %s\n", identify+1, argv[i+1]); 
      break; 
     case 2: 
      printf("Child : %d %s\n", identify+1, argv[i+2]); 
      break; 
     case 3: 
      printf("Child : %d %s\n", identify+1, argv[i+3]); 
      break; 
     } 
    } 
    // do stuff 
} 

int main(int argc, char *argv[]){ 
    int childLimit = 4; // number of children wanted 
    int childrenPids[childLimit]; // array to store children's PIDs if needed 
    int currentPid, i; 

    for(i=0; i<childLimit; i++){ 
     switch(currentPid = fork()){ 
      case 0: 
       // in the child 
       childFunction(argv, i); 
       // exit the child normally and prevent the child 
       // from iterating again 
       return 0; 
      case -1: 
       printf("Error when forking\n"); 
       break; 
      default: 
       // in the father 
       childrenPids[i] = currentPid; // store current child pid 
       break; 
     } 

    } 

    printf("Father : %d childs created\n", i); 

    // do stuff in the father 

    //wait for all child created to die 
    waitpid(-1, NULL, 0); 
} 

更新要件: 私はそれは私がが新しい昇順で配列に各子プロセスの部材要素を維持印刷に必要である、さらなる要件を明確にする必要がソートが必要です。

コードは、最初の答えに応じてを改正:

for(i = childnum; i < argc; i += 4) 
{ 
    for(j = 0; j < argc; j++) 
    { 
     a[j] = argv[i]; 
     printf("%s ", a[j]) ; 
     break; 
    } 
} 

を、それは次のような出力を生成:

./a.out ff ee gg tt hh oo ee pp 
Child : 1, pid 762 : ff hh 
Child : 3, pid 764 : gg ee 
Child : 2, pid 763 : ee oo 
Father : 4 childs created 
Child : 4, pid 765 : tt pp 

出力は偉大に見えるが、別のの配列に格納する方法と、 ソート、つまり子要素1の昇順を実行しますか? childFunction()

+1

例の出力が両方とも完了していれば(つまり、4つのプロセスすべて)、入力例の先の説明と一致してもそれほど混乱はありません。 – Clifford

+0

「店舗」とはどういう意味ですか?どこで、どのような目的で保管しますか? – Clifford

答えて

1

あなたの反復が、その後繰り返しインデックスは、このように、スイッチを必要とせずに引数を選択するために直接使用することができ、identify + 1から始まる場合:

void childFunction(char *argv[], int argc, int identify) 
{ 
    int childnum = identify + 1 ; 

    printf("Child : %d, pid %d : ", childnum, getpid()); 
    for(int i = childnum; i < argc; i += 4) 
    { 
     printf("%s ", argv[i]) ; 
    } 
    printf("\n") ; 
} 

argcchiledFunction()にに合格する必要があります。 sizeof(argv)は引数の数ではなく、char**ポインタのサイズです。あなたのmain()に呼び出しは、このように変更する必要があります。

 childFunction(argv, argc, i); 

もう一つのお勧めの変化が出力に後に父親のテキストwaitpid()です:

//wait for all child created to die 
    waitpid(-1, NULL, 0); 

    printf("Father : %d children created\n", i); 

そうでない場合は、その出力は、途中に現れる可能性があります子プロセスのものです。

提案された変更は、(私のテストで)次の結果:

sh-4.2$ main 11 22 33 44 55 66 77 88                                                
Child : 1, pid 156 : 11 55                                                  
Child : 3, pid 158 : 33 77                                                  
Child : 2, pid 157 : 22 66                                                  
Child : 4, pid 159 : 44 88                                                  
Father : 4 children created                                                   

は、子の実行順序が決定論的ではないことに注意してください。上記の例では、順序は1,3,2,4であるが、他のテストでは1,2,3,4-YMMVであった。

+0

もう一度質問します。私が11 55を配列に格納したい場合は、他の配列に33 77、第3の配列に22 66、第4の配列に44 88を格納します。それから私は何をすべきですか? –

+0

@SamAnnie:それがあなたの「店舗」要件の明確化であれば、それはコメントとして投稿されるのではなく、質問に明記されるべきです。もしそれが別の質問であるなら(本当にどんな場合でも)、別の質問を投稿してください。コメントは質問や回答のためのものではありません。しかし、明らかな解決策は、ループ内で4ではなく1だけインクリメントされ、次にchild_argv [j] = argv [i];を割り当てる第2のカウンタ(「j」と言う)を維持することです。この要件を含むように質問を更新する場合は、正当にこの回答に追加することができます。 – Clifford

+0

あなたの答えに応じて質問が更新されました。この質問に関する最新の回答を提供してください。 –

関連する問題