私は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()
で
例の出力が両方とも完了していれば(つまり、4つのプロセスすべて)、入力例の先の説明と一致してもそれほど混乱はありません。 – Clifford
「店舗」とはどういう意味ですか?どこで、どのような目的で保管しますか? – Clifford