pmatteo
15-05-2009, 21:35
Salve,
volevo porvi un problema che mi sono ritrovato durante l'elaborazione di un programma c/c++ riguardo la gestione dei processi in unix. Dovrei sviluppare un programma che crea un processo figlio tramite fork() il quale ricorsivamente chiama il programma stesso, pero devo creare un contatore che si decrementa a ogni chiamata e di conseguenza quando questi è uguale a 0 deve terminare il programma. Io ho utilizzato ovviamente la funzione della famiglia exc, excve passando il contatore come una variabile d'ambiente e decrementandola ogni chiamata; pero il programma mi esegue un solo ciclo, entra nella excve e poi termina. Questo è il mio codice:
//////////////////////////////////////////////////////////////
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char *argv[], char *envp[])
{
char *ch=getenv("N");
int i=atoi(ch);
pid_t pid;
printf(" %s\n ", ch);
if((pid=fork())==0)
{
printf(" contatore %d, creazione\n", i);
i=i-1;
sprintf(ch, "%d", i);
printf(" %s\n ", ch);
setenv("N", ch, 1);
char *arg[]={ (char*)0 };
char *env[]={"N", (char*)0};
if(i>0){
printf("Entrato\n");
execve("./ricorsione", arg, env);
exit(-1);
}
else{
printf("Terminazione\n");
exit(1);
}
}
exit(0);
}
////////////////////////////////////////////////////////
dove vi ho aggiunto la stampa di alcune variabili per verificare il comportamento; il programma entra nell'if, entra nell' execve e poi termina.
Sapreste darmi una spiegazione? perche a me il codice sembra abbastanza corretto...
vi ringrazio
ciao ciao
volevo porvi un problema che mi sono ritrovato durante l'elaborazione di un programma c/c++ riguardo la gestione dei processi in unix. Dovrei sviluppare un programma che crea un processo figlio tramite fork() il quale ricorsivamente chiama il programma stesso, pero devo creare un contatore che si decrementa a ogni chiamata e di conseguenza quando questi è uguale a 0 deve terminare il programma. Io ho utilizzato ovviamente la funzione della famiglia exc, excve passando il contatore come una variabile d'ambiente e decrementandola ogni chiamata; pero il programma mi esegue un solo ciclo, entra nella excve e poi termina. Questo è il mio codice:
//////////////////////////////////////////////////////////////
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char *argv[], char *envp[])
{
char *ch=getenv("N");
int i=atoi(ch);
pid_t pid;
printf(" %s\n ", ch);
if((pid=fork())==0)
{
printf(" contatore %d, creazione\n", i);
i=i-1;
sprintf(ch, "%d", i);
printf(" %s\n ", ch);
setenv("N", ch, 1);
char *arg[]={ (char*)0 };
char *env[]={"N", (char*)0};
if(i>0){
printf("Entrato\n");
execve("./ricorsione", arg, env);
exit(-1);
}
else{
printf("Terminazione\n");
exit(1);
}
}
exit(0);
}
////////////////////////////////////////////////////////
dove vi ho aggiunto la stampa di alcune variabili per verificare il comportamento; il programma entra nell'if, entra nell' execve e poi termina.
Sapreste darmi una spiegazione? perche a me il codice sembra abbastanza corretto...
vi ringrazio
ciao ciao