示例#1
0
/**
 * Initialisation de l'anneau
 */
void init(char** argv) {
  printf("== Initialisation de l'anneau...\n");
  
  //
  // Mémoire partagée
  printf("==== Création de la mémoire partagée\n");
  
  printf("====== Création du segment\n");
  
  if ((__shmid = shmget(ftok(argv[1], ANNEAU_SHM_KEY), ANNEAU_SHM_SIZE, IPC_CREAT |  0666)) == -1) {
    __raise(-3, "======== ERROR: Impossible de créer le segment partagé.");
  }
  // Attachement à une adresse choisie par le système
  if ((__anneau = shmat(__shmid, NULL, 0)) == (void *) -1) {
    __raise(-4, "======== ERROR: Attachement impossible");
  }
  printf("====== Mémoire partagée %d créée\n", __shmid);
  
  // SIGINT
  signal (SIGINT, callback_sigint);
  
  // Création du sémaphore
  __semaphore = sem_open(SEM_NAME, O_CREAT, 0644, 1);
  
  printf("==[ Utilisez Ctrl+C stopper l'anneau ]==\n\n");
}
示例#2
0
int ph_raise(uint_t pid, uint_t sig)
{
    return __raise(pid, sig);
}
示例#3
0
int main(int argc, char *argv[]) {
  int cadence = ANNEAU_CADENCE_DEFAULT; // Cadence définit en millisecondes
  
  if (argc < 2) {
    __raise(-1, "Usage: %s <projet [, cadence]>", argv[0]);
  }
  
  //
  // Initialisation
  init(argv);
  
  // Cadence
  if (argc > 2) {
    cadence = atoi(argv[2]);
  }
  
  // Anneau
  int i;
  Anneau ano;
  
  ano.id 	= __pid;
  
  for (i = 0; i < ANNEAU_NUM_CASES; i++) {
    ano.cases[i].num 	= i;
    ano.cases[i].type 	= VIDE;
    ano.connexion[i] 	= 0;
  }
  
  *((Anneau *) __anneau) = ano;
    
  // 
  // Démarrage
  
  printf("== Démarrage de l'anneau...\n");
  printf("==== Cadence de rotation: %d ms/tour\n", cadence);
  
  //
  info();
  
  //
  // Petite pause
  usleep(2000);
  
  //
  // Rotation
  int rotation = 1;
  while (1) {
    usleep(cadence * 1000); // Attente
    
    // La roue tourne d'un pas
    tourner();
    printf("\tRotation %5d: \n", rotation++);
    info();
    
    // Émission d'un signalS sonore pour informer les robots 
    ding();
  }
  
  __endProcess();
  return 0;
}
示例#4
0
static void _sigwrap(struct msg *msg) {
	__raise(RP_PID(msg->source), msg->port);
	free(msg);
}