PDA

Visualizza la versione completa : [C] Un programma che si richiama da solo...


Kamui
01-06-2003, 01:04
E' pensabile sviluppare un programma che si invochi da solo all'interno di un ciclo, passandosi dei parametri tra cui un contatore che conta quante volte si è già richiamato?

qualcosa come:


nomeprogramma.c

[...]

char nome[18]="./nomeprogramma.c\0";
char cont[2];

for(int i=0; i<5; i++){
sprintf(cont,"%d",i);
execlp(nome,nome,cont,NULL);
}

[...]


:ciauz:

Kamui
01-06-2003, 09:20
Ehm, lasciate perdere il ".c", quello è ovviamente il nome dell'eseguibile ;)

r0x
01-06-2003, 13:30
Devi fare una fork() per ogni execp() se no il programma "va a puttane" e non finisce mai. :D Se no usa system() che e` piu` semplice.

Kamui
01-06-2003, 15:39
L'ho fatto così


int main(int argc,char* argv[])
{
char nome[]="./lvl3";
char cont[2];
pid_t pid;
int i,num;

for(i=0; i<3; i++)
{
pid=fork();
if (pid==0)
{
sprintf(cont,"%d",i);
execlp(nome,nome,cont,NULL);
printf("\nErrore in execlp\n");
}
else
{
num=atoi(argv[1]);
printf("\nMi eseguito %d volte\n",num);
}
}
}


E mi è crashato linux perchè non esce dalla fork :D
Come faccio ad evitarlo? che funzione è system(), non la conosco :confused:

r0x
01-06-2003, 16:37
Scusami ma ho dimenticato un particolare importante. :D

Il programma ovviamente chiama se stesso all`infinito anche con fork(). Dovresti considerarla un po` come una ricorsione, passo base e passo ricorsivo, se no non ne esci. :eek:

Per system() .. 'man system'. Ci sono le comodita`, usiamole. :quipy:

Ma perche` devi fa sta roba?

Kamui
01-06-2003, 21:41
Purtroppo non ho i manuali installati sulla mia mandrake (non le sezioni delle funzioni C almeno), quindi man system mi dà no manual entry :quipy:

Devo farla per un esercizio d'esame, dal testo abbastanza criptico a dir la verità, ma io ho capito che si richiama da sè :D
Almeno, c'è scritto che riceve in ingresso due parametri, uno conta le volte che si connette ad un server e l'altro non ricordo; poi appunto si connette al server, e le volte successive non fa più questo passo... :d56:

Io lo farei contando e autospedendomi il contatore no? :adhone: Però giustamente non se ne esce :dottò:

Kamui
05-06-2003, 20:43
Ho risolto giocando coi parametri :D


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>

int main(int argc,char* argv[])
{
char nome[]="./lvl3";
char cont[2];
int param;
param=atoi(argv[1]);
param++;
printf("\nAttuale valore del parametro: %d\n",param);

if(param<3){
sprintf(cont,"%d",param);
execlp(nome,nome,cont,NULL);
printf("\nErrore in execlp\n");
}

if(param==3){
printf("\nMi sono eseguito le 3 volte desiderate; termino :)\n");
}

return 0;
}


[sly@localhost Client]$ gcc -Wall -g livello3.c -o lvl3
livello3.c: In function `main':
livello3.c:18: warning: implicit declaration of function `execlp'
[sly@localhost Client]$ ./lvl3 -1

Attuale valore del parametro: 0

Attuale valore del parametro: 1

Attuale valore del parametro: 2

Attuale valore del parametro: 3

Mi sono eseguito le 3 volte desiderate; termino :)
[sly@localhost Client]$

Loading