Linux进程间通信之信号量(semaphore)是变量,是一种特殊的变量。它紧取正值。对信息号量的操作只有2中:
- 等待(wait)
- 发送信号(signal)
信号量比较难理解。下面我们一个个的看一下各个函数。与信号量处理的函数有:semget();semctl();semop();
第一个semget()函数
与共享内存的shmget()函数类似。
使用格式:
#includeint semget(key_t _key ,int _nsems,int _semflg);
功能:创建一个新的信号量或获取一个已经存在的信号量的键值。
返回值:成功返回信号量的标识码ID。失败返回-1;
参数:
_key 为整型值,用户可以自己设定。有两种情况:
1、键值是IPC_PRIVATE,该值通常为0,意思就是创建一个仅能被进程进程给我的信号量。
2、键值不是IPC_PRIVATE,我们可以指定键值,例如1234;也可以一个ftok()函数来取得一个唯一的键值。
_nsems 表示初始化信号量的个数。比如我们要创建一个信号量,则该值为1.,创建2个就是2。
_semflg :信号量的创建方式或权限。有IPC_CREAT,IPC_EXCL。
IPC_CREAT如果信号量不存在,则创建一个信号量,否则获取。
IPC_EXCL只有信号量不存在的时候,新的信号量才建立,否则就产生错误。
下面我们看个小例子:
#include#include#define MYKEY 6666int main(){ int semid; semid=semget(MYKEY,1,IPC_CREAT|0666);//创建了一个权限为666的信号量 printf("semid=%d",semid); return 0;}
运行结果为:
我们可以用ipcs –s 来查看是否创建成功。
用ipcrm -s semid号来删除指定的信号量。
需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享