进程间的通信如何实现?

现在常用的进程间通信的有信号,信号量,消息队列,共享内存。

消息队列是一种比较高级的进程间通信方法,因为它真的可以在进程间传送message,一个消息队列可以被多个进程所共享,如果一个进程的消息太多,一个消息队列放不下,也可以用多于一个的消息队列(不过可能管理会比较复杂)。

共享消息队列的进程所发送的消息除了message本身还有一个标志,这个标志可以指明该消息将由哪个进程或者哪类进程接受,每一个共享消息队列的进程针对这个队列也有自己的标志,可以用来表明自己的身份。

共享消息队列消息发送:

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct  msgbuf{
	long mtype;
	char mtext[255];
};

int main()
{
	int msg_id = msgget(123,IPC_CREAT|0666);
	if(msg_id != -1)
	{
		struct msgbuf  mybuf;
		mybuf.mtype = 1;
		strcpy(mybuf.mtext,"I'm send process.\n");
		
		//发送消息
		if(msgsnd(msg_id, &mybuf, sizeof(mybuf.mtext),0))
		{
			printf("success\n");
		}
		else
		{
			perror("msgsnd:");//发送
		}
	}
	else
	{
		
		perror("msgget:");
		
	}
	return 0;
}

 

共享消息队列消息接收:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct msgbuf{
	long mtype;
	char mtext[255];
};

int main()
{
	int msg_id = msgget(123,IPC_CREAT|0666);
	if(msg_id != -1)
	{
		struct msgbuf mybuf;
		if(msgrcv(msg_id,&mybuf,sizeof(mybuf.mtext),0,IPC_NOWAIT) != -1) //接收消息队列的消息
        {
		   printf("read suceess:%s\n",mybuf.mtext);
		   if(msgctl(msg_id,IPC_RMID,0) != -1)//删除这个消息队列
		   {
			   printf("detele msg suceess\n");
		   }
		   else
		   {
			    perror("msgsnd:");   
		   }
		}
	}
	else
	{
		perror("msgget:");
		
	}

	return 0;
}

 

信号和信号量是不同的,他们虽然都可以用来实现同步和互斥,但前者是使用信号处理器来进行的,后者是使用P、V操作来实现的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值