ds.c 2.49 KB
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>


#define ATTENTE 3
int vitesse_train =0;
int conducteur_actif =1;
pthread_mutex_t mutex;

void hand(int sig){
        printf("Veuiller bouger\n");
}

void * conducteur_action(void* arg){
    while(1){
        sleep(ATTENTE);
        pthread_mutex_lock(&mutex);
        if(conducteur_actif==0){
            kill(getppid(),SIGINT);
            sleep(3);
            if(conducteur_actif==0){
                kill(getppid(),SIGKILL);
            }
        }    
        conducteur_actif=0;
        pthread_mutex_unlock(&mutex);   
    }
}

int main(int argc, char * argv[]){
    int fils1;
    int action_courante=0;
    int tube[2];
    pthread_mutex_init(&mutex,NULL);
    if(pipe(tube)<0){
        perror("erreur pipe");
        exit(1);
    }
    
    if((fils1=fork())<0){
        perror("erreur exec du fork");
        exit(1);
    }
    if(fils1 == 0){
        close(tube[1]); //fils n'écrit pas
        int variation_v;
        
        pthread_t tid1;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        pthread_create(&tid1, &attr, conducteur_action, NULL);
        while(read(tube[0],&variation_v,sizeof(int))==sizeof(int)){
            
            pthread_mutex_lock(&mutex);
            conducteur_actif = 1;
            pthread_mutex_unlock(&mutex);  
            
            vitesse_train = vitesse_train + variation_v;
            printf("Vitesse actuelle: %d\n",vitesse_train);
        }
        close(tube[0]);
    } else {
        
        struct sigaction action;
        sigset_t ens;
        sigemptyset(&ens);
        action.sa_handler = hand;
        action.sa_mask =ens;
        action.sa_flags = SA_RESTART;
        sigaction(SIGINT,&action,NULL);
        
        close(tube[0]); //pere 1 ne lit pas 
        printf("Action:\n");
      
        scanf("%d",&action_courante);
        while(action_courante != -2){
                if((action_courante<2) && (action_courante>-2)){
                    write(tube[1], &action_courante, sizeof(int));
                }
                scanf("%d",&action_courante);
        }
        vitesse_train=0;
        close(tube[1]);
        
        int r, pid;
        if((pid= wait(&r)) <0){
            perror("erreur exec du wait");
            exit(1);
        }
        printf("\nDans le père, train arrêté, vitesse: %d\n",vitesse_train);
        
    }
    return 0;
}