|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
[C] Funzione atexit() in un programma multiprocesso
Ciao a tutti!
Avrei bisogno di aiuto riguardo alla funzione atexit(): ho notato che in un programma multiprocesso, se il padre registra alcune funzioni da eseguire all'uscita e poi crea dei processi figli, anche i processi figli, prima della loro terminazione, invocano le stesse funzioni registrate dal padre. Esiste un modo per far si che cio' non accada? Purtroppo io ho necessita' di richiamare la funzione atexit() prima della fork... Potrei inserire un controllo sul valore di ritorno della fork direttamente nelle funzioni di uscita (se diverso da zero esegui le istruzioni della funzione, altrimenti no) ma, oltre a essere un po' brutto, mi costringe ad usare una var. globale per tale valore... Come fo'? Grazie, Gica
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Il comportamento che osservi è corretto se pensi a come funziona la fork. Potresti considerare l'utilizzo dei thread.
Comunque, se usi i fork, puoi controllare nella tua atexit che il processo sia il parent di tutti gli altri: if(getpid()!=getpgrp()) { /* e' un child */ } else { /* e' il group leader (il processo di origine) */ } Questo metodo funziona solo se nessun child chiama setsid() o altrera in altri modi l'appartenenza ad un certo grouppo di programmi.
__________________
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: Mar 2005
Messaggi: 1653
|
Quote:
Con i thread non ho ancora molta confidenza... Grazie, Gica
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Ancora una cosa...
Codice:
/* File che contiene la funzione main() */
#include "funzione.h"
int main()
{
funzione();
printf("Ciao...\n");
return 0;
}
/* Fine file */
/* File "funzione.h" */
void funzione();
void termina();
/* Fine file */
/* File "funzione.c" */
static int var;
void funzione()
{
var=34;
atexit(termina);
}
void termina()
{
printf("%d\n", var);
}
/* Fine file */
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
termina() ha la corretta visibilità della variabile.
__________________
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: Mar 2005
Messaggi: 1653
|
Quote:
Grazie (*) correzione: ho scritto una fesseria! Se termina() viene chiamata esplicitamente nel main(), non vi e' alcun problema! E' la variabile var che non e' visibile nel main()...
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto Ultima modifica di Gica78R : 05-07-2005 alle 23:55. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:27.



















