#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
union semun{int val; struct semid_ds *buf;unsigned short int *array;};
void print(int); /*表示共享资源*/
int value; /*用于取得信号灯的值*/
int main(int argc,char **argv)
{
int n=0; /*用于循环*/
int id; /*信号灯*/
struct sembuf lock_it;
union semun options;/*创建信号灯*/
id = semget(ftok(argv[1],0),1,IPC_CREAT|IPC_EXCL|0666);
if(id==-1)
perror("semget fail");
options.val=3;/*设置信号灯的值*/
semctl(id,0,SETVAL,options);
while(n++<5)
{
if(fork()==0) /*创建进程*/
{ while(1)
{ lock_it.sem_num=0;
lock_it.sem_op=-1; /*信号灯减1*/
lock_it.sem_flg=IPC_NOWAIT;
if((semop(id,&lock_it,1))==-1)
{
if(errno==EAGAIN) /*如果没有可用的信号灯就继续循环*/
continue; exit(1);
} print(id); /*执行表示共享资源的函数*/
}
}
}
sleep(3);
semctl(id,0,IPC_RMID,0); /*删除一个信号灯*/
exit(0);
}
void print(int id){
printf("I get id,my pid is %d\n",getpid());
value=semctl(id,0,GETVAL);
printf("now the value have %d\n",value);
sleep(1);
}
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
union semun{int val; struct semid_ds *buf;unsigned short int *array;};
void print(int); /*表示共享资源*/
int value; /*用于取得信号灯的值*/
int main(int argc,char **argv)
{
int n=0; /*用于循环*/
int id; /*信号灯*/
struct sembuf lock_it;
union semun options;/*创建信号灯*/
id = semget(ftok(argv[1],0),1,IPC_CREAT|IPC_EXCL|0666);
if(id==-1)
perror("semget fail");
options.val=3;/*设置信号灯的值*/
semctl(id,0,SETVAL,options);
while(n++<5)
{
if(fork()==0) /*创建进程*/
{ while(1)
{ lock_it.sem_num=0;
lock_it.sem_op=-1; /*信号灯减1*/
lock_it.sem_flg=IPC_NOWAIT;
if((semop(id,&lock_it,1))==-1)
{
if(errno==EAGAIN) /*如果没有可用的信号灯就继续循环*/
continue; exit(1);
} print(id); /*执行表示共享资源的函数*/
}
}
}
sleep(3);
semctl(id,0,IPC_RMID,0); /*删除一个信号灯*/
exit(0);
}
void print(int id){
printf("I get id,my pid is %d\n",getpid());
value=semctl(id,0,GETVAL);
printf("now the value have %d\n",value);
sleep(1);
}