2010-08-19 28 views
1

我想通过在我的程序中使用手动开关调用它们来测试信号灯的动作。我已经准备好了,但是在通话过程中我没有把它们谴责。我使用UNIX系统。 请注意:功能defitions很好,把它们放在这里快速refence.The问题是在这些函数低于cal。我会很乐意提供任何帮助。测试信号灯如何工作

//----------------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

那么你的问题是什么? – 2010-08-19 09:54:04

+0

什么平台? OS X至少不支持命名信号量。 – Potatoswatter 2010-08-19 09:55:27

+0

另外,什么是'semaphore.h'? – Potatoswatter 2010-08-19 09:58:45

回答

0

信号量是用于进程间通信。所以你至少需要两个进程。只用一个进程测试它们是毫无意义的:-)

启动你的程序两次,然后键入相应的命令(等待#1,信号#2等)。

+0

我有一个文件来执行testing.its和可执行文件,但是问题在开关的调用似乎需要一些更好的编码,不知道 – 2010-08-19 09:58:07

+0

啊。请注意,'scanf()'只有在读取换行符后才会调用(例如,当您按Enter键或者当换行符中有换行符时为了使事情更容易处理,我建议阅读一整行文本,将其分成单词,然后解析这些单词。请参阅此链接以开始使用:http://www.hellboundhackers.org/论坛/ string_to_array_in_c__split_it_word_by_word-22-14415_0.html – 2010-08-19 10:13:56