1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
#define CLE_IPCMSG 123
#define CLE_SEM_ATELIER 456
struct message{
long type;
int pid;
char message[20];
}
int pidaccueil;
int msgid;
struct message client;
void accueil();
void clientarrive();
int main(int argc, char** argv[]){
int pipe_accueil_mecano[2];
int pipe_mecano_client[2];
if (msgid = msgget(CLE_IPCMSG,IPC_CREAT | IPC_EXCL) == -1)
traitanterreurmsg(msgid);
if (semget(CLE_SEM_ATELIER,IPC_CREAT | IPC_EXCL) == -1)
traitanterreur(1);
if (pipe(pipe_accueil_mecano) == -1)
traitanterreur(2);
if (pipe(pipe_mecano_client) == -1)
traitanterreur(3);
printf("Bienvenue au garage !!!\n");
switch(fork()){
case -1 :
traitanterreur(4);
case 0 :
accueil();
traitanterreur(5);
default :
wait(NULL);
exit(0);
}
}
void accueil(){
struct sigaction act_accueil;
sigset_t sig_accueil;
act_accueil.sa_handler = clientarrive;
sigemptyset(&act_accueil.sa_mask);
act_accueil.sa_flags = SA_RESTART;
if (sigaction(SIGUSR1,&act_accueil,NULL) == -1)
traitanterreur(6);
sigemptyset(&sig_accueil);
pidaccueil = getpid();
while (1){
sigsuspend(&sig_accueil);
}
}
void clientarrive(){
int erreur;
int taille_message = sizeof(client) - sizeof(long);
if (erreur = msgrcv(msgid,&client,taille_message,0,IPC_NOWAIT) == -1)
traitanterreurmsg(erreur);
printf("%d",client.pid);
} |
Partager