unix-ipc

#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值