一、信号量相关的API

(1)semget:
man 2 semegt
在这里插入图片描述

创建或获取一个信号量组:若成功返回信号量集ID,失败返回-1。
int semget(key_t key,int num_sems,int sem_flags);
key_t key key

int num_sems 信号量集中的信号量的个数

int sem_flags 判断信号量是否存在

不存在的话,就要创建信号量

IPC_CREAT|0666

(2)semop
man 2 semop
在这里插入图片描述

对信号量组进行操作,改变信号量的值,成功返回0,失败返回-1。

int semop(int semid,struct sembuf semoparry[],size_t numops)

(3)semctl
对信号量进行操作
man 2 semctl
在这里插入图片描述

int semctl(int semid,int sem_num,int cmd,…)
semid:操作信号量集的id
sem_num:操作第几个信号量
cmd:一般写SETVAL(设置信号量的初值)
第四个参数:定义结构体
类似:
在这里插入图片描述

二、代码实现

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>

//   int semget(key_t key, int nsems, int semflg);
//int semctl(int semid, int semnum, int cmd, ...);

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) */
};


int   main(int argc,char **argv)
{
    key_t key;
	int semid;//1.设置信号量的id

	key=ftok(".",2);

    semid=semget(key,1,IPC_CREAT|0666);//2.创建信号量
	//  1  代表信号量中只有一个信号量
	

     union  semun  initsem;//3.设置结构体

	initsem.val=1;//4.只有一把锁

	semctl(semid,0,SETVAL,initsem);//5.初始化信号量
	//0  代表操作第0个信号量

	//SETVAL    设置信号量的值,设置为initsem

        int pid = fork();

         if(pid>0)
	 {
		 //去拿锁

         printf("this is father \n");
                 
	 } 	 

     	 //放回锁
	 else if(pid==0)
	{
	        printf("this is child\n");
	}

	 else
    {
	        printf("fork  error\n");
   }

	return   0;
}

运行结果:
在这里插入图片描述

——@上官可编程

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐