2010-08-19 5 views
1

J'essaie de tester l'action des sémaphores en les appelant dans mon programme avec des commutateurs manuels. J'ai les fonctions prêtes à partir, mais je n'arrive pas à les coder pendant l'appel. J'utilise le système UNIX. S'il vous plaît noter: les fonctions de défections sont très bien, les mettre ici pour une référence rapide. Le problème est avec le caline ci-dessous ces fonctions. Je serai reconnaissant pour toute aide.Test du fonctionnement des sémaphores

//----------------semmaphore.h --------------------------------- 
#define SEM_NAME "semaphore.h",'a' 
#define SEM_MAX 3 
#define FREE  0 
#define DATA  1 
#define ROOM  2 
#define S_WAIT -1 
#define S_SIGNAL 1 
#define NO_EVENT -1 

int sem_config(int, int); 
int sem_wait(int, int); 
int sem_signal(int, int); 

    //----------------semmaphore.c --------------------------------- 

#include <assert.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 

#include "semaphore.h" 

static int sem_id; 

static union semun 
{ 
    int val; /* value for SETVAL */ 
    struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ 
    ushort array[1]; 
} sem_attr; 

    static struct sembuf asem[1]; 
    static key_t s_key; 

int sem_config(int event, int init_val) 
    { 
int x; 
s_key = ftok(SEM_NAME); 
if (-1 == (sem_id = semget(s_key, SEM_MAX, 0666|IPC_CREAT)) { 
    perror("semget"); 
    return -1; 
} 
    if (event == NO_EVENT) 
    return 0; 
sem_attr.val = init_val; 
if (-1 == semctl(sem_id, event, SETVAL, sem_attr)) 
{ 
    perror("semctl SETVAL"); 
    return -1; 
} 
if (-1 == (x = semctl(sem_id, event, GETVAL, sem_attr))) 
    { 
    perror("semctl GETVAL"); 
    return -1; 
    } 
    assert(x == init_val); 
    return 0; 
    } 
//------------------------------------------------------------ 
int sem_wait(int event, int nwaits) 
{ 
asem[0].sem_num = event; 
asem[0].sem_op = nwaits * S_WAIT; 
asem[0].sem_flg = 0; 
if (event == NO_EVENT) /*remove semaphore set*/ 
    if (-1 == semctl(sem_id, 0, IPC_RMID, sem_attr)) 
    { 
     perror("semctl IPC_RMID"); 
     return -1; 
    } 
    else 
     return 0; 
if (-1 == semop(sem_id, asem, 1)) 
{ 
    perror("semop"); 
    return -1; 
} 
return 0; 
    } 
//------------------------------------------------------------ 
int sem_signal(int event, int nsignals) 
    { 
    asem[0].sem_num = event; 
    asem[0].sem_op = nsignals * S_SIGNAL; 
    asem[0].sem_flg = 0; 
    if (event == NO_EVENT) 
    if (-1 == semctl(sem_id, 0, IPC_RMID, sem_attr)) 
    { 
     perror("semctl IPC_RMID"); 
     return -1; 
    } 
    else 
     return 0; 
if (-1 == semop(sem_id, asem, 1)) 
{ 
    perror("semop"); 
    return -1; 
} 
return 0; 
    } 
    //========================PROBLEM STARTS HERE================= 
#include <stdio.h> 
#include "semaphore.h" 

main() 
{ 
char op, discard; 
int event, nval; 
do { 
    printf("Enter semaphore operation "); 
    printf("s(ignal)/w(ait)/i(nit)/f(ind)/c(leanup)"); 
    scanf("%c%c", &op, &discard); 
    printf("Enter semaphore no and initial value :"); 
    scanf("%d%d%c",&event,&nval,&discard); 
    switch (op) 
    { 
     case 'i': 
      // Get semaphore for the forks 
      sem_config(event, nval); 
      printf("Initialized semaphore\n"); 
      break; 

    case 'f': 
      break; 

    case 's': 
      sem_signal(event, 1) 
      break; 

    case 'w': 
      sem_wait(event, nval) 
      break; 

    case 'c': 
      break; 

    default: 
      if (-1 == sem_wait(NO_EVENT, 0)) 
      { 
       printf("semctl IPC_RMID failed\n"); 
       exit(1); 
      } 
      printf("done\n"); 
      exit(0); 
    } 
} while (1); 
    return 0; 
} 
+1

Alors, quelle est votre question? –

+0

Quelle plateforme? OS X, au moins, ne supporte pas les sémaphores nommés. – Potatoswatter

+0

En outre, qu'est-ce que 'semaphore.h'? – Potatoswatter

Répondre

0

sémaphores sont pour interprocessus de communication. Vous avez donc besoin d'au moins deux processus. Les tester avec un seul processus ne sert à rien :-)

Lancez votre programme deux fois, puis tapez les commandes appropriées (attente en # 1, signal en # 2, etc.).

+0

J'ai un fichier pour faire le testing.its et l'exécutable, mais le problème Les appels dans les commutateurs semblent avoir besoin d'un meilleur codage que je ne suis pas sûr de –

+0

Ah. Notez que 'scanf()' est seulement appelé après qu'un readline soit lu (ie quand vous pressez enter ou quand il y a un newline dans le Pour faciliter la gestion des choses, je suggère de lire toute une ligne de texte, de la diviser en mots, puis d'analyser ces mots.Voir ce lien pour commencer: http://www.hellboundhackers.org/ forum/string_to_array_in_c__split_it_word_by_word-22-14415_0.html –

Questions connexes