C语⾔进程间通信--消息队列
Linux操作系统system V进程间通信,主要有三种:
1、消息队列;
2、信号量;
3、内存共享。
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。
Linux消息队列管理:
1、创建消息队列
在使⽤⼀个消息队列前,需要使⽤msgget函数创建该消息队列,其函数声明:
extern int magget(key_t _key,int _msgflg) _THROW;
第⼀个参数key由ftok创建的key值;
第⼆个参数_msgflg的低位⽤来确定消息队列的访问权限。
2、发送消息到消息队列
extern int msgsnd(int _msqid , _const void * _msgq, size_t _msgsz , int _msgflg );
第⼀个参数msgid为指定的消息队列标识符(由msgget⽣成的消息队列标识符),即将消息添加到哪个消息队列中。 第⼆个参数msgq为指向的⽤户定义缓冲区。
第三个参数为接收消息的⼤⼩,其数据类型为:size_t,即unsigned int类型。其⼤⼩为0到系统对消息队列的限制值。 第四个参数⽤来执⾏在达到系统为消息队列所定的界限(如达到字数限制)时应采取的操作。
3、从消息队列接收信息
extern int msgrcv(int _msgid, void * _msgq,size_t _msgsz,long int _msgtyp,int _msgflg);
第⼀个参数为读的对象,即从哪个消息队列获取信息。
第⼆个参数为⼀个临时消息数据结构,⽤来保存读取的信息。
现在,利⽤fork函数,创建⼀个⼦进程,并在⼦进程中利⽤消息队列的⽅式发送信息,在⽗进程中,接收消息。
/***************************************************************************
* fork.c
*
* Tue Nov 29 16:04:18 2011
* Copyright 2011 cluster
* <cluster@<host>>
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct msg_st //消息队列的结构体
{
int my_msg_type;
char msg_text[BUFSIZ];
};
int main(int argc,char **argv)
{进程通信方式
pid_t pid;
int i = 1;
int status;
if( (pid = fork()) == -1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if ( pid == 0) //⼦进程
{
struct msg_st some_data;
int msgid;
char buffer[BUFSIZ];
if((msgid = msgget((key_t)12345,0666|IPC_CREAT)) == -1 )
{
perror("msgget");
exit(EXIT_FAILURE);
}
printf("Enter the mssage to send:");
fgets(buffer,BUFSIZ,stdin);
_msg_type = 1;
strcpy(some_data.msg_text,buffer);
if((msgsnd(msgid,(void *) &some_data,MAX_TEXT,0)) == -1)
{
perror("msgsnd");
exit(EXIT_FAILURE);
}
return 0;
}
else //⽗进程
{
int msgid1;
struct msg_st some_data1;
int msg_to_recevie = 0;
if((msgid1= msgget((key_t)12345,0666|IPC_CREAT)) == -1)
{
perror("msgget");
exit(EXIT_FAILURE);
}
if(msgrcv(msgid1,(void *) & some_data1,BUFSIZ,msg_to_recevie , 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("recevier mssage : %s",some_data1.msg_text);
if(msgctl(msgid1,IPC_RMID,0) == -1)
{
{
fprintf(stderr,"msgctl(IPC_RMID) failed \n"); exit(EXIT_FAILURE);
}
return 0;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论