Chiamate di sistema fork() e exec()

di Paolovox il
18 risposte

  pid = fork();
    if (pid > 0)
       codice-A;

    else if (pid == 0)
       exec("eseguibile-B");

    else
        codice-C;

    codice-D
Perchè l'affermazione il processo figlio col PID == 0 esegue sempre l'eseguibile B e non esegue mai il codice D è falsa?? Non dovrebbe essere vera?

18 Risposte

  • Se ho capito cosa intendi, il codice-D si trova all'esterno della struttura else, quindi viene SEMPRE eseguito
  • Quindi con la syscall exec() sostituisco l'immagine del processo chiamante ma non terminandolo.
  • tuixte ha scritto:


    Se ho capito cosa intendi, il codice-D si trova all'esterno della struttura else, quindi viene SEMPRE eseguito
    Anche a me non torna!
    exec sostituisce il processo, quindi esegue l'eseguibile-B e non arriva mai al codice-D.
  • In realtà potrebbe eseguire il codice D nel caso in cui exec fallisca. Penso che considerando questo caso l'affermazione risulta falsa.
  • C'è qualcosa che non torna. Ho provato ad eseguire questo codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(){
        pid_t pid;
        pid = fork();
            if (pid > 0)
               printf("codice-A\n");
            else if (pid == 0)
               execl("echo", "ECHO", " codice-B", NULL);
            else
                printf("codice-C\n");
            printf("codice-D\n");
    
       return 0;
    }
    
    OUTPUT:
    codice-A
    codice-D
    codice-D
  • Oregon dove vuoi. Perchè ritorna due volte codice-D? A quanto pare esegue sia il ramo con pid>0 che con pid==0.
  • 
      pid = fork();
        if (pid == 0){
           //sono il figlio
           exec("eseguibile-B");
           //questa riga di codice non verrà mai eseguita almeno che exec non ritorni errore
           puts("errore);
           _exit(1);
        }
        else if (pid == -1)
        {
             puts("errore fork");
             _exit(1);
        }
        
        //qui esegue il codice del padre ovvero dove continua il processo che ha invocato la fork
    
    Il crossposting è una tecnica irrispettosa nei confronti di chi ti aiuta GRATUITAMENTE.
  • Chiedo scusa ma non volevo mancare di rispetto a nessuno. La prossima volta eviterò.
  • Sicuri che questa

    execl("echo", "ECHO", " codice-B", NULL);

    non sia sbagliata e quindi il processo continui con la sezione-D?
  • Penso sia corretta, perchè che cosa sbaglio?
  • Forse volevi scrivere

    "/bin/echo"
  • Hai ragione, scusatemi per lo stupido errore.
  • Perchè l'affermazione:
    il processo figlio col PID == 0 esegue sempre l'eseguibile B e non esegue mai il codice D è falsa??
    Tornando al quesito iniziale è vera. Giusto? Cioè il figlio esegue B e mai D.
Devi accedere o registrarti per scrivere nel forum
18 risposte