最近在学习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;
}