C stampa e memorizza l’argomento della riga di comando in modo round robin

Sono nuovo alla programmazione c e ho riscontrato questo problema di implementazione. La situazione è che ho bisogno di usare fork() per creare 4 processi figlio per stampare gli argomenti della riga di comando in modo round robin, cioè se l’input è ./abc.c RR GG EE WW BB CC DD AA , processo figlio 1 dovrebbe memorizzare e stampare RR BB , processo figlio 2 dovrebbe memorizzare e stampare GG CC e così via. L’output finale dovrebbe assomigliare a questo.

 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 

Il 3 e il 4 ° processo figlio hanno risultati simili.

Il problema è la parte del negozio. Come possiamo archiviare questi argomenti correttamente e usare printf o altri metodi per produrre l’output sopra? Un processo figlio stampa una riga. Non riesco a capire la soluzione.

Il requisito del negozio è quello di memorizzare l’elemento figlio 1 è un array. S5 HT DK S4 H7 S6 S8 D2 H3 H2 DT DA S9 , memorizzare gli elementi Child 2 in una matrice. C7 HA D6 S7 SQ HK H6 H4 C3 CK S2 C9 SJ e così via.

Ecco cosa ho in questo momento.

 #include  #include  #include  #include  #include  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); } 

Requisiti aggiornati: ho bisogno di chiarire ulteriormente il requisito, ovvero ho bisogno di stampare , mantenere l’ elemento membro di ogni processo figlio in un array con un nuovo requisito di ordinamento crescente .

codice modificato secondo la prima risposta:

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

produce il seguente risultato:

  ./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 

L’output ha un bell’aspetto, ma come archiviarli in array separati ed eseguire un ordinamento , cioè un ordine crescente di elementi Child 1?

In childFunction() se l’iterazione inizia childFunction() identify + 1 , allora l’indice di iterazione può essere usato direttamente per selezionare l’argomento senza la necessità di un interruttore, quindi:

 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" ) ; } 

Nota la necessità di passare argc a chiledFunction() ; sizeof(argv) non è un conteggio del numero di argomenti - è la dimensione di un puntatore char** ; nella tua main() la chiamata dovrebbe essere cambiata così:

  childFunction(argv, argc, i); 

Un'altra modifica consigliata è di generare il testo padre dopo waitpid() :

  //wait for all child created to die waitpid(-1, NULL, 0); printf("Father : %d children created\n", i); 

altrimenti è probabile che il suo output appaia nel mezzo di quello dei processi figli.

Le modifiche suggerite risultano nel seguito (nel mio test):

 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 

Nota che l'ordine dell'esecuzione del bambino non è deterministico. Nell'esempio sopra l'ordine è 1, 3, 2, 4, ma in altri test è stato 1, 2, 3, 4 - YMMV.