PDA

Visualizza la versione completa : [C] Problema con funzione execl


Prog13
15-02-2014, 18:05
Ciao a tutti! Stavo cercando di capire come funzionasse la funzione exec, e, aiutandomi con un esempio, ho scritto questo codice:


execl("bin/ls", "ls", (char *) 0);
cout << "Exec fallito" << endl;


E fin qui tutto bene, mi appare la lista degli elementi nella directory dov'è contenuto il programma, e (giustamente) non appare il cout "Exec fallito".

Se invece provo ad usare l'exec con un codice da me realizzato, incontro difficoltà.
Ho provato a scrivere :


execl("Scrivania/Esercizi/Pid", "start", (char *) 0);
cout << "Exec fallito" << endl;


In cui "Pid" è la cartella di un programma che stampa a video il pid di un processo (programma che non ha nessuna variabile d'ingresso), e "start" l'eseguibile del processo.
Così però l'exec fallisce (infatti mi appare a video il cout "Exec fallito"). Sono convinto che il mio errore sia nei primi due argomenti dell'execl... Ho cercato sul web ma non trovo nulla di abbastanza chiaro, qualcuno può aiutarmi?

MItaly
15-02-2014, 18:42
L'eseguibile che vuoi lanciare si chiama start? In tal caso devi scrivere:


execl("Scrivania/Esercizi/Pid/start", "start", (char *) 0);

Il secondo argomento è semplicemente l'argv[0] che riceve il programma, nel primo argomenti di execl devi comunque specificare il path all'eseguibile dal lanciare.

Prog13
16-02-2014, 10:54
Mi fallisce ancora... Ora posto tutto il codice, magari può essere utile.
Questo è il programma che lancio inizialmente (situato nella cartella Scrivania/Esercizi/Exec):


#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

int main(void){

pid_t pid;
switch (pid=fork()){
case -1:
cout << "Errore" << endl;
break;
case 0:
cout << "Inizio processo figlio" << endl;
execl("Scrivania/Esercizi/Pid/start", "start", (char *) 0);
cout << "Exec fallito" << endl;
break;
default:
wait((int *)0);
cout << "Fine!!";
exit(0);
}

}

Mentre quello contenuto nel path specificato dall'exec è questo:

#include <iostream>
#include <unistd.h>

using namespace std;

int main(void){
int pid,ppid;
pid = getpid();
cout << "\n Sono il processo con ID " << pid << endl;
ppid = getppid();
cout << "\n Mio padre è " << ppid << endl ;
return 0;
}


Se faccio partire singolarmente il secondo programma va tutto liscio, quindi il problema è per forza nell'exec, visto che continuo a leggere "Exec fallito"..

MItaly
16-02-2014, 16:09
situato nella cartella Scrivania/Esercizi/Exec
Be' allora è ovvio che non trova il programma da avviare... se non specifichi lo / ad inizio percorso, il percorso passato ad execl è considerato un percorso relativo alla directory corrente, che suppongo sarà ~/Scrivania/Esercizi/Exec, ergo exec sta andando a cercare start in ~/Scrivania/Esercizi/Exec/Scrivania/Esercizi/Pid/start. O correggi il percorso relativo (dovrebbe diventare qualcosa del tipo ../Pid/start) oppure specifichi un percorso assoluto (/home/<nomeutente>/Scrivania/Esercizi/Pid/start).

Prog13
16-02-2014, 16:45
Grazie mille! E scusami per la domanda banale ma sono nuovo di questo sistema operativo :P

MItaly
16-02-2014, 16:48
:ciauz:

(ma è così in praticamente ogni sistema operativo "normale", Windows e Mac OS X inclusi :stordita: )

Loading