PDA

Visualizza la versione completa : [C] Confusione con "padre" e "figlio"


sparkling
20-07-2007, 11:15
Vi posto questo frammento di codice e poi vi dico il problema che mi da:



if((pid = fork()) == -1)
{
perror("Nella fork()\n");
exit(errno);
}
else if (pid == 0)
{
/* siamo nel figlio. Il figlio da questo punto in poi dialoga col client */

/* creazione della pipe clientserverpid */
sprintf(clientserver,"clientserver%d%c",p,'\0');
crea_pipe(clientserver);

/* apertura della pipe clientserverpid */
fifo_fi = apri_pipe(clientserver,O_RDWR);

/* mando la risposta di ok al client per avvertire dell'avvenuta connessione sulla pipe con descrittore fifo_client (creata in precedenza)*/
sprintf(ok,"%d OK%c",getpid(),'\0');
write(fifo_client,&ok,30);
printf("OK:: %s\n",ok);
}
else /* siamo nel padre */
{ }

/* FINE WHILE */

}

/* chiudo ed elimino la pipe clientserverpid */
printf("clientserver --> %s\n",clientserver);
close(fifo_fi);
unlink(clientserver);



Allora, quando mi va a stampare clientserver --> nome della pipe mi stampa 2 volte, una delle quali una serie di caratteri incomprensibili del tipo



clientserver --> ߷�߷nn�߷_


e quando faccio l'unlink mi ritorna -1, cioe' praticamente non mi cancella niente. Perche'?
Molto probabilmente faccio confusione con la fork e nell'utilizzare il padre e il figlio nel modo giusto...
va usata una exec? E se si, in che modo?
Il padre deve fare la wait? Considerate il fatto che deve rimanere in attesa di altre richieste, quindi mi verrebbe da pensare che non occorre fare nessuna wait poiche' deve girare in bg.. o no?
Potete aiutarmi?
Grazie... :ciauz:

Gnix
20-07-2007, 12:58
Mmm .. diciamo che dal punto in cui tu richiami fork vengono creati due processi che vanno avanti da li.. il figlio fa un po di istruzioni nell'if. Mentre il padre non fa niente e va ad eseguire le istruzioni successive i printf seguito da un close(fifo_fi) e dall'unlink. A questo punto io non so cosa hai fatto prima ma se in clientserver non c'era qualcosa, allora si spiega i caratteri inleggibili, invece per quanto riguarda l'unlink probabile che il padre cerchi di fare unlink ancora prima che il figlio ha creato la pipe.

B sicuramente il padre deve fare qualcosa ma esattamente cosa dipende da quello che intendi fare. :)

Ciao..
Gnix

sparkling
20-07-2007, 16:21
Un'altra cosa non capisco, pero' non so se c'entra con quanto descritto sopra. Praticamente nel resto del programma io creo una directory e ci metto dentro delle cartelle e un file. Tutto ok, mi crea tutto come previsto. Solo che adesso sono andata a cancellare (tramite rmdir da shell) la directory in questione e non me lo faceva fare dicendomi directory not empty. Digito ls e mi dice total 0. Non capisco. Al che digito ls -a e mi appare un file chiamato .nfs005d02e300000021. Che cos'e'?? Da cosa puo' dipendere? Digito ps -a e noto che il programma mi e' rimasto attivo...
:stordita: non muore il padre? Rimane uno zombie? Non ci sto capendo piu' nulla... :dh:

Loading