进程间通信

信号灯集

概念

信号灯也叫信号量,是不同进程间或一个给进程内部不同线程间同步的机制

System V信号灯集是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。

通过信号灯集实现共享内存的同步操作

创建步骤

创建key值  key_t key key=ftok(文件,字符)

创建打开信号灯集 semid=semget(key,信号灯集的数量,权限)

初始化信号灯集 semctl(semid,信号灯集的编号,SETVAL,共用体)

pv操作 semop(semid,&buf,要操作的信号灯的个数)

struct sembuf buf={要操作的编号,pv操作,0阻塞}

union semun{
int val;
};
//初始化
void semit(int semid,int num,int val)
{
union semun sem;
sem.val=val;
semctl(semid,num,SETVAL,sem);
}
//pv操作
void sem_op(int semid,int num,int op)
{
struct sembuf buf;
buf.sem_num = num;
buf.sem_op = op;
buf.sem_flg=0;
semop(semid,&buf,1);
}

消息队列

特点

消息队列就是一个消息列表,用户可以在消息队列中添加消息,读取消息

消息队列可以按照类型来发送/接收消息

在linux下消息队列大小有限制

        消息队列的个数最多16个

        总容量最多16384字节

        每个消息内容最多8192字节

步骤

创建key值 key_t key; key=ftok("文件”,‘a’);

创建或打开消息队列 msgget(key,权限(IPC_CREAT|IPC_EXCL|0666));

添加消息(写消息) msgsnd(msqid,&msg,大小,0(发送完才有返回值));

读取消息 msgrcv(msgrcv,&msg,大小,0(若无消息函数会一直堵塞));

删除消息队列 msgctl(msgid,IPC_REID,NULL);

struct msgbuf
{
long mtype;//消息类型
char ch[32];//消息正文
int num;
};
int main(){
struct msgbuf msg={100,"hello",10};
int msgid;
msgid=msgget(key,IPC_CREAT|IPC_EXCL|0666);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值