Originariamente inviato da P4nico
seguendo la tua documentazione ho riscritto questo :
Non ti ho inviato nessuna documentazione, bensì un esempio scritto da me.
Ora modifico il tuo codice, mettendo dei commenti e degli output per illustrarti meglio cosa succede al tuo programma (aggiungendo verso la fine un semplice meccanismo, per far sì che i padri non finiscano il proprio lavoro prima dei figli)
Codice PHP:
//
// Written by P4nico,
// modified with comment, extra output, and simple waiting for fathers by MacApp.
//
// Compiled and tested with:
// i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
//
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char str[30], c;
int figlio1,figlio2,i,cont1=0,cont2=0;
cout << "Inserisci la stringa: ";
cin >> str;
// fgets(str,10,stdin);
cout << "Inserisci il carattere: ";
cin >> c;
if ((figlio1=fork())==-1){
cout << "Fork Impossibile!"<< endl;
exit(-1);
}
else if (figlio1 == 0){
// MacApp: questa parte viene eseguita solo dal figlio.
for (i=0; i < 30; i++){
if ((i%2)==0)
if (str[i]==c)
cont1++;
}
}
// MacApp: questa parte del programma viene eseguita sia dal padre che dal figlio!
// Infatti viene stampato DUE volte:
// una volta con figlio1 = 0 dal primo figlio, l'altra con il pid del figlio dal padre.
cout << "MacApp: prima fork: figlio1: " << figlio1 << ";" << endl;
// MacApp: adesso con la fork, il figlio generera' un nipote,
// ed il padre un altro figlio che chiamiamo fratello.
if ((figlio2=fork())==-1){
cout << "Fork Impossibile!"<< endl;
exit(-1);
}
else if (figlio2 == 0){
// MacApp: questa parte viene eseguita dal nipote e dal fratello!
for (i=0; i < 30; i++){
if ((i%2)!=0)
if (str[i]==c)
cont2++;
}
}
// MacApp: questa parte del programma viene eseguita
// dal padre, dal figlio, dal fratello del figlio, e dal nipote del padre (figlio del primo figlio)!
// Infatti viene stampata QUATTRO volte (non necessariamente nell'ordine del commento):
// 1. Una volta con figlio1 = 0, figlio2 = 0 dal nipote.
// 2. Un'atra volta con figlio1 = 0, figlio2 > 0 dal primo figlio;
// 3. Un'altra volta con figlio1 > 0, figlio2 = 0 dal secondo figlio del padre, ovvero dal fratello del primo figlio.
// 4. Un'altra volta con figlio1 > 0, figlio2 > 0 dal padre.
cout << "MacApp: seconda fork: figlio1: " << figlio1 << "; figlio2: " << figlio2 << ";" << endl;
cout << "Figlio1 = " << cont1 << ", Figlio2 = " << cont2<< endl;
// MacApp: ora faccio attendere la fine dei lavori dei vari figli:
// osserva che lo sleep in effetti non garantisce la sincronia al 100%.
// Per fare un lavoro fatto bene, si dovrebbe mettere in piedi un meccanismo di comunicazione,
// tra i vari processi generati, affinché il padre non finisca il proprio lavoro prima dei figli.
if ((0 == figlio1) && (figlio2 > 0)){
// MacApp: faccio attendere al primo figlio che il proprio figlio (nipote del padre) finisca il proprio lavoro;
cout << "MacApp: il primo figlio attende che il nipote finisca il proprio lavoro: figlio1: " << figlio1 << "; figlio2: " << figlio2 << ";" << endl;
sleep (1);
}
if ((figlio1 > 0) && (figlio2 > 0)){
// MacApp: faccio attendere al padre che i suoi due figli finiscano il proprio lavoro;
cout << "MacApp: il padre attende che i suoi due figli finiscano il proprio lavoro: figlio1: " << figlio1 << "; figlio2: " << figlio2 << ";" << endl;
sleep (2);
}
return EXIT_SUCCESS;
}
Studia bene il primo esempio (scritto da me) che ti ho mandato!
;-)