PDA

View Full Version : [C] Funzione atexit() in un programma multiprocesso


Gica78R
30-06-2005, 10:50
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

ilsensine
30-06-2005, 11:00
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.

Gica78R
30-06-2005, 15:17
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.
Il processo padre rimane il process group leader, quindi posso fare come hai detto.
Con i thread non ho ancora molta confidenza...

Grazie,
Gica

Gica78R
05-07-2005, 08:02
Ancora una cosa...

/* 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 */

Eseguendo il programma, la funzione termina viene eseguita prima del return del main. Ma in questo caso, la variabile var (essendo static) non dovrebbe essere fuori dalla visibilita' del programma? Cmq, compilando (aggiungendo gli opportuni header) funziona comunque, senza errori. Pero' immagino che sia scorretto concettualmente, vero?

ilsensine
05-07-2005, 11:25
termina() ha la corretta visibilità della variabile.

Gica78R
05-07-2005, 11:37
termina() ha la corretta visibilità della variabile.
Ah, ecco... :D Quindi non e' come se la chiamata alla funzione termina() fosse messa nel corpo del main(). (*)

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()... :)