信号量编程

 int semget(key_t key, int nsems, int semflg);
 //返回信号量的ID    int  nsems->>信号量的个数  int semfig->>若没有则创建IPC_CREAT
  int semop(int semid, struct sembuf *sops, unsigned nsops);
//struct sembuf *sops 结构体指针 
             sops[0].sem_num = 0;        信号量标量 0
           sops[0].sem_op = 0;        等待值
           sops[0].sem_flg = 0;		等待阻塞
int semctl(int semid, int semnum, int cmd, ...);
	int cmd,   SETVAL 设置信号量的初值  ....定义一个联合体		
	   union semun {
               int              val;    /* Value for SETVAL */  初始值
               struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
               unsigned short  *array;  /* Array for GETALL, SETALL */
               struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                           (Linux-specific) */
           };
	

demo

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
union semun {
	int              val;    /* Value for SETVAL */
	struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
	unsigned short  *array;  /* Array for GETALL, SETALL */
	struct seminfo  *__buf;  /* Buffer for IPC_INFO
				    (Linux-specific) */
};
void pGetKey(int semid)  //p操作
{
	struct sembuf set;
	set.sem_num=0;
	set.sem_op=-1;
	set.sem_flg=SEM_UNDO;
	semop(semid,&set,1);
}
void vPutKey(int semid)   // V操作
{
	struct sembuf set;
	set.sem_num=0;
	set.sem_op=1;
	set.sem_flg=SEM_UNDO;
	semop(semid,&set,1);
}

int main()
{
	key_t key;
	key=ftok(".",1);
	int semid=semget(key,1,IPC_CREAT|0666);
	union semun initsem;
	initsem.val=0;
	
	semctl(semid,0,SETVAL,initsem);
	int pid=fork();
	if(pid>0){
		pGetKey(semid);
		printf("This is father\n");
	}else if(pid==0){
		vPutKey(semid);
		printf("This is sun\n");
	}else{
		printf("creat fork\n");
	}
	return 0;
}

本人初学Linux写此demo也是为了以后自己好查看,后续如果有新的理解会慢慢补充,各大网友如果发现错误请留言,我积极改正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值