PDA

Visualizza la versione completa : [C] execlp e current directory__help!!


ww3ww3
08-06-2008, 12:12
salve a tutti,
so che questo argomento gia stato trattato ma non ne riesco a venire a capo
ho un problema nell'execlp di un file nella stessa directory che pero non va. chiarisco con codice:

>file es1.c<

#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

int
main (int argc, char *argv[])
{
int pid;

if((pid=fork())<0) perror("errore nella fork()");
if (pid == 0)
{
execl("./es1figlio.o","es1figlio.o", (char*)0);
printf("Errore execlp\n");
}

}
>end file es1.c<

lo compilo con gcc -o es1.o es1.c

>file es1figlio.c(nella stessa directory)<
int
main (int argc, char *argv[])
{
printf("\nHello\n");
}
>end file es1figlio.c<
lo compilo con gcc -o es1figlio.o es1figlio.c


S.O. usato ubuntu 8.04

all'esecuzione di
./es1.o

ottengo
"Errore execlp"

overo l'exec non va buon fine.Mi aiutate a capire dove sbaglio?
grazie.

mondobimbi
08-06-2008, 12:42
non saprei cosa dirti, ti deve funzionare.
Controlla che tutti i file siano stati scritti correttamente ed esegui il programma dalla stessa directory dove sono memorizzati.
Un appunto, non chiamare l'eseguibile .o , in quanto normalmente sono i file oggetto che hanno quella estensione. Non necessario che tu dia una estensione all'eseguibile.
ciao

ww3ww3
08-06-2008, 13:20
Ora capisci il mio dilemma..
DOVREBBE funzionare... ma non funge.:nonono: :bh: :nillio:
tutti i test fatti..
Altre idee? :master:

810106
08-06-2008, 14:05
Intanto usa nomi differenti


gcc -o es1 es1.c
gcc -o es1figlio esi.figlio.c




if((pid=fork())<0)
perror("errore nella fork()");
if (pid == 0)
{
if(execl("./es1figlio","es1figlio", (char*)0) == -1)
perror("execl");
}

Prova cosi... almeno se fallisce ti da un messaggio di errore piu specifico...

ww3ww3
08-06-2008, 15:54
fatto ma come ovvio che sia...nada.

Ho risolto alternativamente, anche se la mia soluzione non per niene pulita come la prima ma pi una sorta di artefatto...

int
main (int argc, char *argv[])
{
int pid,stato;
char * pPath;
char * filename="es1figlio";
char tmp[100];
pPath = getenv ("PWD");//prendo path corrente
sprintf(tmp,"%s/%s\0",pPath,filename);

if((pid=fork())<0) perror("errore nella fork()");
if (pid == 0)
{
printf("exec del figlio \n");
if((stato=execl(tmp,filename,0))<0) perror("Errore nell'esecuzione di execlp!!!\n");
}

}

in pratica prendo la variabile dall'environnement.
Non una soluzione che mi fa impazzire a funziona per lo scopo.
Qualcuno saprebbe aiutarmi sulla soluzione precedente?

ww3ww3
08-06-2008, 15:56
Bho misteri della fede...
mo funziona pure cosi


int
main (int argc, char *argv[])
{
int pid,stato;
char * filename="es1figlio";
char tmp[100];
sprintf(tmp,"./%s\0",filename);

if((pid=fork())<0) perror("errore nella fork()");
if (pid == 0)
{
printf("exec del figlio \n");
if((stato=execl(tmp,filename,0))<0) perror("Errore nell'esecuzione di execlp!!!\n");
}

}

810106
08-06-2008, 19:05
Questo il tuo codice iniziale:


...
if (pid == 0)
{
execl("./es1figlio.o","es1figlio.o", (char*)0);
printf("Errore execlp\n"); /*** Sbaglio o manca un if? ***/
}
...


Questo il tuo nuovo codice:


...
if (pid == 0)
{
printf("exec del figlio \n");
if((stato=execl(tmp,filename,0))<0) perror("Errore nell'esecuzione di execlp!!!\n"); /*** QA C'E IF(...) */
}
...

Sar mica questo il problema??? :fagiano:

mondobimbi
08-06-2008, 19:10
no, non c'entra, l'istruzione che segue l'istruzione execl (e anche le altre della famiglia exec) viene eseguita solo se questa fallisce, altrimenti il controllo passa al nuovo processo.
ciao
sergio

Loading