Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    29

    [C] Problema con funzione execl

    Ciao a tutti! Stavo cercando di capire come funzionasse la funzione exec, e, aiutandomi con un esempio, ho scritto questo codice:

    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 :

    codice:
     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?

  2. #2
    L'eseguibile che vuoi lanciare si chiama start? In tal caso devi scrivere:
    codice:
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    29
    Mi fallisce ancora... Ora posto tutto il codice, magari può essere utile.
    Questo è il programma che lancio inizialmente (situato nella cartella Scrivania/Esercizi/Exec):

    codice:
    #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:
    codice:
    #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"..

  4. #4
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    29
    Grazie mille! E scusami per la domanda banale ma sono nuovo di questo sistema operativo :P

  6. #6


    (ma è così in praticamente ogni sistema operativo "normale", Windows e Mac OS X inclusi )
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.