Sistemi di Calcolo

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2017-2018

HomePage | Avvisi | Diario lezioni | Programma | Materiale didattico | Esami | Forum | Login
myexec.c
#include <stdio.h>
#include <unistd.h>

int main() {

    char* argv[] = { "ls", "-l", NULL };
    int res = execvp("ls", argv);

    perror("errore nella exec");

    printf("questa riga viene eseguita solo se "
           "non e' stato possibile lanciare il programma\n");
    return 1;
}


Esempio di fork: genitore attende terminazione del figlio, con figlio che rimane zombie finché il genitore non ne recupera con wait lo stato di terminazione.

myfork.c
#include <unistd.h> // fork
#include <stdio.h>

int main() {
    printf("[gen] sto per fare una fork, sono %d!\n",
        getpid());

    pid_t pid = fork();

    if (pid == 0) {  // codice eseguito dal figlio
        printf("[figlio] proc=%d [genitore=%d]\n", getpid(), getppid());
        printf("[figlio] terminato\n");
        _exit(13);
    }

    // codice eseguito dal genitore
    int status;
    sleep(40);
    pid_t c = wait(&status);

    printf("[gen] processo %d e' terminato con stato %d\n", c, status);

    printf("[gen] terminato\n");
    return 0;
}


Altro esempio di fork: genitore termina prima del figlio, che prende come nuovo genitore un altro processo antenato nell'albero dei processi.

myfork2.c
#include <unistd.h> // fork, getpid, getppid
#include <stdio.h>

int main() {
    printf("[gen] sto per fare una fork, sono %d!\n", getpid());

    pid_t pid = fork();

    if (pid == 0) {
        printf("[figlio] proc=%d [genitore=%d]\n", getpid(), getppid());
        sleep(40);
        printf("[figlio] terminato dopo il padre [nuovo genitore=%d]\n", getppid());
        _exit(13);
    }

    printf("[gen] terminato prima del figlio\n");
    return 0;
}

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0441 seconds