|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Processi <defunct>
Mi pare di avere capito che un processo è segnalato come defunct se è terminato, ma una qualche risorsa ad esso associata è ancora allocata. E se tali risorse sono ad esempio risorse IPC (condivise con altri processi ancora attivi) che non posso deallocare...?? devo aspettare che terminino tutti iprocessi per eliminare la lista infinita di defunct?
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
__________________
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: Jul 1999
Città: Torino
Messaggi: 2221
|
Grazie.
Mi registro... |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
L'ho semplicemente trovato con google...credo risponda alla tua domanda
__________________
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: Jul 1999
Città: Torino
Messaggi: 2221
|
Mi pare di avere capito che il sistema necessita di mantenere questi id in quanto il padre potrebbe volere essere informato della loro terminazione... Ma se a me non interessa... ?
Nel mio specifico caso non posso inserire una wait del processo... |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
?
No, mai visto in vita mia Cmq tieni conto che quando un figlio muore, il padre dovrebbe ricevere notifica tramite un SIGCHLD.
__________________
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 |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Allora basterebbe mettersi in ascolto con una signal(SIGCHLD,SIG_DFL ) ?
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
No appena provato i defunct non scompaiono...
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
No; intendevo che dentro l'handler si SIGCHLD puoi eseguire la wait/waitpid...
L'azione di default di SIGCHLD è ignorare il segnale; ci fai ben poco...
__________________
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: Jul 1999
Città: Torino
Messaggi: 2221
|
Capisco...senti...ma così facendo, obbligo il padre ad aspettare il figlio vero? (con la wait nell'handler della signal)
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Se sei nell'handler, vuol dire che il figlio è _già_ terminato, e attende solo la wait...
__________________
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: Jul 1999
Città: Torino
Messaggi: 2221
|
giusto!
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Ho risolto mettendo signal(SIGCHLD,SIG_IGN);
comportamento strano: di default dovrebbe ignorare, però se metto SIG_DFL i defunct appaiono lo stesso... sai darmi una spiegazione?? |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
No...è tra l'altro scorretto che ignorando il segnale gli zombie scompaiono.
__________________
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 |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Si penso sia un comportamento troppo legato alla versione di Linux, Unix...
Ho trovato delle informazioni, le riporto in caso possano essere utili a qualcuno: Quote:
Codice:
: void HandSigCHLD(int sig)
02: {
03: int errno_save;
04: int status;
05: pid_t pid;
06: /* save errno current value */
07: errno_save = errno;
08: /* loop until no */
09: do {
10: errno = 0;
11: pid = waitpid(WAIT_ANY, &status, WNOHANG);
12: if (pid > 0) {
13: debug("child %d terminated with status %x\n", pid, status);
14: }
15: } while ((pid > 0) && (errno == EINTR));
16: /* restore errno value */
17: errno = errno_save;
18: /* return */
19: return;
20: }
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
grrrrrrrrr...i defunct spariscono si...ma la chiamata all'handler sembra interferire con la gestione delle code di messaggi...sballandomi tutto
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Dai una occhiata alla documentazione delle funzioni che usi, in particolare all'errore EINTR
__________________
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: Jul 1999
Città: Torino
Messaggi: 2221
|
EINTR Interrupted function call. Una funzione di libreria è stata interrotta. In genere questo avviene causa di un segnale asincrono al processo che impedisce la conclusione della chiamata. In questo caso è necessario ripetere la chiamata alla funzione.
Capisco...ma come posso ripetere quella chiamata?? Non c'è modo di ricevere il segnale NON mentre esegue una funzione di libreria? |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Il segnale può arrivare in qualsiasi momento, ad esempio quando il processo è in attesa in kernel mode di un evento (tipo lo sblocco di un semaforo, giusto per rimanere in tema). In questa situazione, la syscall termina con un errore EINTR.
Soluzione banale: Codice:
#define IGNINT(fnc, retval) do { \
retval = fnc; \
} while(retval<0 && errno==EINTR)
(...)
int retval;
IGNINT(semop(semid, &sop, 1), retval);
__________________
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: 00:47.



















