|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
[C linux] Chiarimenti sulla wait()
Salve a tutti, ho bisogno di un chiarimento sulla funzione wait(). Da quello che ho capito un processo fa la fork e vuole aspettare la terminazione del figlio. Quando il figlio termina la propria esecuzione manda un SIGCHLD al padre. Se il padre fa una wait(NULL), riprende l'esecuzione qando il figlio ha terminato, giusto? Ho fatto un programmino che usa questa wait(), in patica il padre crea N figli e vuole riprendere a funzionare quando tutti i figli hanno terminato. Ho scritto questo pezzettino:
Codice:
for (i=0; i<N; ++i) {
pid_t pid=fork();
if (pid==0) spesa();
}
while (j<N) {
if ((i=(int)wait(NULL)) <=0) {
perror("Errore nella wait");
exit(-1);
}
printf("Il cliente %d ha terminato la sua esecuzione\n", i);
}
printf("\nTutti i clienti hanno terminato la propria esecuzione\n");
Qualcuno mi sa aiutare?? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
La wait si trova sia nel path del padre che dei figli, mi sembra.
__________________
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 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Per caso tra le semplificazioni hai anche tolto l'inizializzazione e l'incremento di j?
__________________
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 |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
Codice:
void genera_clienti (int N) {
int i, j, numf, tipo, semaforo, bilancia, listaspesa[10];
if ((semaforo= semget(5785, 10, IPC_CREAT | IPC_EXCL)) <0) {
perror("Errore nella creazione del semaforo");
exit(-1);
}
if ((bilancia= semget(3486, 1, IPC_CREAT | IPC_EXCL)) <0) {
perror("Errore nella creazione del semaforo bilancia");
exit(-1);
}
semun ctl_arg;
ctl_arg.array=(unsigned short *) calloc (10, sizeof(unsigned short));
if (semctl(semaforo, 0, SETALL, ctl_arg) <0) {
perror("Errore nella chiamata a semctl -1-");
exit(-1);
}
printf("\nSto generando i clienti...\n\n");
ctl_arg.val=1;
if (semctl(bilancia, 0, SETVAL, ctl_arg) <0) {
perror("Errore nella chiamata a semctl per bilancia");
exit(-1);
}
for (i=0; i<N; i++) {
for (j=0; j<10; j++) listaspesa[j]=0;
numf=rand()%10;
if (numf<3) numf+=3;
for (j=0; j<numf; j++) {
tipo=rand()%10;
while (listaspesa[tipo]!=0) (++tipo)%10;
listaspesa[tipo]=rand()%10;
}
pid_t pid=fork();
if (pid==0) {
casse=(int *) shmat (fdcasse, 0, SHM_RND);
printlistaspesa(listaspesa);
spesa(listaspesa, semaforo, bilancia);
}
else sleep(1);
}
j=0;
ctl_arg.array=(unsigned short *) calloc (10, sizeof(unsigned short));
for (i=0; i<10; i++) ctl_arg.array[i]=1;
if (semctl(semaforo, 0, SETALL, ctl_arg) <0) {
perror("Errore nella chiamata a semctl -2-");
exit(-1);
}
while (j<N) {
if ((i=(int)wait(NULL)) <=0) {
perror("Errore nella wait");
exit(-1);
}
printf("Il cliente %d ha terminato la sua esecuzione\n", i);
++j;
}
printf("\nTutti i clienti hanno terminato la propria esecuzione\n");
}
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sembra corretto; non vorrei che qualche figlio va in crash (anche se questo dovrebbe mandare in crash anche il padre, credo).
Puoi allegare il codice completo, così lo compilo & testo qui in locale?
__________________
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 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
ecco il programma. ti avverto comunque che il programma ancora non è terminato quindi mancano ancora delle cose importanti (come la deallocazione delle risorse dei semafori, infatti se il programma va in crash devi cambiare le key dei semafori e ricompilare o riavviare il sistema per far ripartire il programma). in pratica il fatto della wait mi serve perchè se non la facessi il padre terminerebbe la propria esecuzione e i figli sarebbero zombie, e questo non lo posso permettere perchè andrebbe contro le specifiche.
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
speriamo che il sensine non abbia scoperto che in realtà era un virus! a quest'ora dovrebbe già essergli scoppiato il pc!
![]() |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Vedo errori un pò ovunque, tranne nel tuo wait. Mi puzza di buffer overflow o altre delizie, credo che faresti bene a controllare i vari passi.
Ad esempio qui Codice:
if (semctl(semaforo, 0, SETALL, ctl_arg) <0) {
perror("Errore nella chiamata a semctl -1-");
exit(-1);
}
Sotto root non ho questo errore, il programma va avanti con errori nei punti più impensabili.
__________________
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 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
nb per evitare di riavviare ogni volta, credo che ti basti togliere IPC_EXCL nelle semget.
__________________
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: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
![]() per il resto hai qualche idea? anche a te ha dato quell'errore a runtime?? |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Argh!
Codice:
if ((semaforo= semget(5785, 10, IPC_CREAT >>> | 0600 <<<)) <0) {
perror("Errore nella creazione del semaforo");
exit(-1);
}
if ((bilancia= semget(3486, 1, IPC_CREAT >>> | 0600 <<<)) <0) {
perror("Errore nella creazione del semaforo bilancia");
exit(-1);
}
__________________
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: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Se crei il semaforo senza diritti di lettura/scrittura, come fai a modificarlo?
Lo fai già per la shmget, il principio è lo stesso. Questa patch risolve il problema. Nota che con IPC_PRIVATE, non è necessario specificare IPC_CREAT: Codice:
--- main.c.org 2004-09-17 16:48:07.000000000 +0200
+++ main.c 2004-09-17 17:30:52.000000000 +0200
@@ -76,11 +76,11 @@
void genera_clienti (int N) {
int i, j, numf, tipo, semaforo, bilancia, listaspesa[10];
- if ((semaforo= semget(5785, 10, IPC_CREAT | IPC_EXCL)) <0) {
+ if ((semaforo= semget(IPC_PRIVATE, 10, 0600)) <0) {
perror("Errore nella creazione del semaforo");
exit(-1);
}
- if ((bilancia= semget(3486, 1, IPC_CREAT | IPC_EXCL)) <0) {
+ if ((bilancia= semget(IPC_PRIVATE, 1, 0600)) <0) {
perror("Errore nella creazione del semaforo bilancia");
exit(-1);
}
__________________
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 |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
grazie ilsensine!
![]() Quote:
|
|
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
||
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
in pratica mi dà l'errore su quella wait quando termina un processo figlio...
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Questo è il mio output con parametro "25"...
__________________
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: 06:20.





















