|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
[C-unix]PIPE, sbaglio qualcosa?
Codice:
1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #define TRUE 1
6 #define FALSE 0
7 #define ERROR -1
8 #define PERM 0644 //Definisce i permessi per la creazione dei file:rw per l'user e r per il gruppo e gli altri
9 #define N_ARGS 2 //Numero di argomenti atteso
10 #define MSGSIZE 20
11
12 void error(char * error, int ex_value){
13 perror(error);
14 exit(ex_value);
15 }
16
17 int checkArgs(int n){
18 if(n-1!=N_ARGS) return ERROR;
19 return TRUE;
20 }
21
22
23 main(int argc, char *argv[]){
24
25 int nr,wr,piped[2];
26 int pid, ppid;
27 int cycle;
28 char buffer[MSGSIZE];
29
30 if((checkArgs(argc))<0) error("Numero argomenti inatteso", 1);
31 if(pipe(piped)<0) error("Errore pipe: ", 2);
32 if((pid=fork())<0) error("Errore fork: ",3);
33 cycle=atoi(argv[2])+1;
34 if(pid==0){
35 //------- FIGLIO --------
36 ppid=getppid();
37 close(piped[1]); //Figlio: chiusura lato scrittura
38 while((nr=read(piped[0],buffer,MSGSIZE))>0){
39 printf("Ricevuto: %s\n", buffer);
40 }
41 printf("PIPE senza scrittore: exit\n");
42 exit(0);
43 }
44 else{
45 //------- PADRE ---------
46 close(piped[0]); //Padre: chiusura lato lettura
47 while(cycle--) write(piped[1],argv[1],MSGSIZE);
48 close(piped[1]);
49 exit(0);
50 }
51 }
Funziona, cioà mi stampa a video "PIPE senza scrittore: exit" ma sembra però che non termini realmente finchè non premo INVIO. Da cosa è dato questo comportamento? C'è qualcosa di strano nel codice? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Se nel padre, dopo che chiude il lato di scrittura, aggiungo un wait() allora funziona come dovrebbe, come mai?
Tra l'altro senza wait il figlio legge meno messaggi di quelli che il padre spedisce, in teoria la pipe, essendo FIFO non dovrebbe cacciarli fuori tutti, a partire dal primo scritto? Non capisco... |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Oddio rimane zombie senza wait?
Zombie, mamma mia che roba. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Eh si avevo creato proprio un bello zombie.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Il programma termina correttamente, ma sul tuo sistema evidentemente il child termina dopo il padre. Quindi dopo che il programma si è chiuso il child stampa le sue ultime cose, che ti mandano a capo la console e...ti danno l'impressione che il programma non è ancora finito. Quando premi invio il prompt viene stampato nuovamente e...ti sembra che il programma è finito ora.
La wait semplicemente impedisce al padre di terminare prima del child; sostituiscila per prova con una sleep(1) e verdrai che è così!
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Allora si, non mi ero accorto che la console me la mette subito appena finisce il padre e quindi quando finisce il figlio la console me l'ha già ridata, ma si trova prima delle stampe del figlio.
Ad ogni modo, essendo che senza wait il padre finisce prima del figlio, creo uno zombie vero? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Altra cosa, come mai le stampe che metto nel padre vengono visualizzate solo dopo che il figlio finisce?
Edit:mi sbagliavo. Ultima modifica di MEMon : 06-03-2008 alle 15:06. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Se anche il padre termina, senza chiamare wait/waitpid, penserà init a ripulire lo zombie.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ok grazie, quindi in questo caso il processo figlio viene chiamto orfano visto che il padre termina prima del figlio?
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Viene "reparented" al processo con pid 1 (tipicamente init), che ne diventa il "parent".
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Se devo inviare su una pipe un INT utilizzando wirte, come posso fare?
Una cosa così funziona? Codice:
int i=10; write(pipe[0],&i,sizeof(int)) |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
A funzionare funziona; la parte che legge deve essere certa che sta per leggere 4 byte, e che quei 4 byte sono il tuo int.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Allora ho dei casini vari nel programma, se te lo posto mi ci dai un'occhiata?
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
non ci contare troppo...postalo cmq
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ma non capisco, quando apro una pipe da utilizzare fra due processi, devo OBBLIGATORIAMENTE chiudere il lato della pipe che non uso?
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
No va beh non vorreis tressarti perchè sono tante righe, comunque non riesco a capire bho...
Ho aperto N pipe, e ho creato N figli, ogni coppia di figli utilizzia una pipe, e N-2 pipe non le usa, come mi devo comportare, le pipe che non usa un figlio le devo chiudere sia in lettura che scrittura? |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Edit:sono un cojote, non avevo creato tutte le pipes... sarà la stanchezza?
Ultima modifica di MEMon : 06-03-2008 alle 23:23. |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
--edit
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:48.




















