tp1_fork_ex3.c 2.79 KB
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
/*
int main(){
    int cr, ent=0;
    if((cr=fork())<0){
        perror("erreur exec du fork");
        exit(1);
    }
    if(cr == 0){
        printf("dans le fils, val de ent : %d\n", ent);
        ent ++;
        printf("dans le fils, val de ent après incrémentation: %d\n", ent);
    } else {
        int r, pid;
        printf("dans le père, val de ent : %d\n", ent);
        ent++;
        printf("dans le père, val de ent après incrémentation: %d\n", ent);
        if((pid= wait(&r)) <0){
            perror("erreur exec du wait");
            exit(1);
        }
    }
    return 0;
}

int main(){
    int fork1, fork2;
    if((fork1=fork())<0){
        perror("erreur exec du fork");
        exit(1);
    }
    if(fork1 == 0){
        printf("dans le fils1, pid: %d\n", getpid());
        sleep(2);
    }
   
    else {
        if((fork2=fork())<0){
            perror("erreur exec du fork");
            exit(1);
        }
        if(fork2 == 0){
            printf("dans le fils2, pid: %d\n", getpid());
            sleep(4);
        } 
        else{
            int r, pid;
            printf("dans le père, val de ent : %d\n", getpid());
            if((pid= wait(&r)) <0){
                perror("erreur exec du wait");
                exit(1);
            }
            if((pid= wait(&r)) <0){
                perror("erreur exec du wait");
                exit(1);
            }
        }
    }
    return 0;
}
*/
int main(){
    int fils, petitfils;
    if((fils=fork())<0){
        perror("erreur exec du fork");
        exit(1);
    }
    if(fils == 0){
        sleep(2);
        if((petitfils=fork())<0){
            perror("erreur exec du fork");
            exit(1);
        }
        if(petitfils == 0){
            sleep(4);
            printf("dans le petitfils, pid: %d\n", getpid());
            for(;;){}
            exit(8);
        } 
        else{
            int r, pid;
            printf("dans le fils, val de ent : %d\n", getpid());
            if((pid= wait(&r)) <0){
                perror("erreur exec du wait");
                exit(1);
            }
            if(WIFEXITED(r)){
                printf("Mort normale du fils: %d\n", WEXITSTATUS(r));
            }else if( WIFSIGNALED(r)){
                printf("Fils mort avec le code: %d\n", WTERMSIG(r));
            }
            exit(2);
        }
    } else {       
        int r, pid;
        printf("dans le père, val de ent : %d\n", getpid());
        if((pid= wait(&r)) <0){
            perror("erreur exec du wait");
            exit(1);
        }
        if(WIFEXITED(r)){
            printf("Mort normale du fils: %d\n", WEXITSTATUS(r));
        }else if( WIFSIGNALED(r)){
            printf("Fils mort avec le code: %d\n", WTERMSIG(r));
        }
    }
    return 0;
}