进程间通信-信号量集 (生产者-消费者模型)

最近在学习C的时候,在对信号进行量编程的时候,无意中写的....全部都是自己一个一敲的,其中参考了别的程序,自己也有所修改,运行平台式在linux2.6内核中运行成功的......

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#define MAX 5
#define KEY1 1492
#define KEY2 1493
#define KEY3 1494
#define IFLAGS (IPC_CREAT|IPC_EXCL)
#define N 1024
#define SEMKEY1 (key_t)0x2000
#define SEMKEY2 (key_t)0x2001
#define SEMKEY3 (key_t)0x2002

int products;
int space;
int mutex;
int nshm;
union semun
{
int val;
struct semid_ds *buf;
unsigned short *arg;
};
int get_sem_val(int sid,int semnum)
{
return semctl(sid,semnum,GETVAL,0);
}
void init_sem(int sid,int semnum,int initval)
{
union semun semopt;
semopt.val = initval;
if(-1==semctl(sid,semnum,SETVAL,semopt))
{
   perror("semctl error:");
   exit(0);
}
}
int sem_init(key_t key ,int initval)
{
int semid;
union semun arg;
if((semid = semget(key,1,0660|IFLAGS)) == -1)
{
   perror("semget error:");
   exit(0);
}
arg.val = initval;
if(-1 == semctl(semid,0,SETVAL,arg))
{
  
   perror("semctl error:");
   exit(0);
}
return semid;
}
void P(int semid)
{
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = -1;
sb.sem_flg = 0;
if(-1 == semop(semid,&sb,1))
{
   perror("semop error:");
   exit(0);
}
}
void V(int semid)
{
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = 1;
sb.sem_flg = 0;
if(-1 == semop(semid,&sb,1))
{
   perror("semop error:");
   exit(0);
}

}
int productItem()
{
static int i = 1;
printf("produre a product %d/n",i);
return i++;
}
void consum(int Item)
{
printf("consume a product %d/n",Item);
}
void fun()
{
if(-1 == semctl(products,0,IPC_RMID,0))
{
   perror("semctl error:");
   exit(0);
}
if(-1 == semctl(space,0,IPC_RMID,0))
{
   perror("semctl error:");
   exit(0);
}
if(-1 == semctl(mutex,0,IPC_RMID,0))
{
   perror("semctl error:");
   exit(0);
}
if(-1 == shmctl(nshm,IPC_RMID,0))
{
   perror("shmctl error:");
   exit(0);
}
exit(0);
}
int main()
{

nshm = shmget(IPC_PRIVATE,1024,IPC_CREAT);
int *buffer = (int *)shmat(nshm,0,0);
products = sem_init(SEMKEY1,0);
space = sem_init(SEMKEY2,N);
mutex = sem_init(SEMKEY3,1);
int i = 0,j = 0;
int pid;
if(signal(SIGUSR1,fun) == (void *) -1)
{
   perror("signal error:");
   return 0;
}
if((pid = fork()) < 0)
{

   perror("fork error:");
   return 0;
}
else if(pid == 0)
{
   int item;
   while(1)
   {
    P(space);
    P(mutex);
    item = productItem();
    *(buffer + sizeof(int)*i) = item;
    i = (i + 1) % N;
    V(mutex);
    V(products);
   }
   return 0;
}
else
{
   int item;
   while(1)
   {
    P(products);
    P(mutex);
    item = *(buffer+sizeof(int)*j);
    j = (j+1) % N;
    consum(item);
    V(mutex);
    V(space);
    if(j == 100)
    {
     kill(pid,SIGKILL);
     kill(getpid(),SIGUSR1);
    }
   }
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值