#include #include #include #include #include #include #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; }