unix-ipc

来源:互联网 发布:udp源端口号 编辑:程序博客网 时间:2024/06/12 05:05
#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
原创粉丝点击