POSIX和system v都是一种应用于系统的协议,POSIX IPC和system v IPC可以用于进程间通讯
1.函数上的区别:System V函数名没有下划线,POSIX函数名有下划线
2.对信号量操作的方式:
POSIX IPC:使用sem_wait()对信号量减1、sem_post()对信号量的加1
system V: 使用semget()获取信号量标志符,对sembuf设置,semop()使用信号
3.POSIX 无名信号灯可以将数据放入共享内存用于进程间的通讯
4.system v信号量有id
system v 实现对信号量加1代码
/*对信号量加一*/
void sem_v(int semid)
{
struct sembuf sops = {0,1,0};//默认阻塞
int ret = semop(semid,&sops, 1);
if (ret == -1)
{
perror("");
}
}
system p实现对信号量减1代码
//对信号量减1
void sem_p(int semid)
{
struct sembuf sops = { 0,-1,0 };//默认阻塞
int ret = semop(semid, &sops, 1);
if (ret == -1)
{
perror("");
}
}
以下外部对信号量减1的操作(外部获取信号量标志符,调用自定义的sem_p()、sem_v()函数即可对信号集进行操作)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <iostream>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;
int main()
{
int semid = semget(1234, 0, 0);// get a System V semaphore set identifier
if (semid == -1)
{
semid = semget(1234, 1, IPC_CREAT | 0666);//打开失败创建
}
sem_p(semid2);
return 0;
}