首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言进程间通信-讯息队列

2012-12-20 
C语言进程间通信--消息队列Linux操作系统system V进程间通信,主要有三种:1、消息队列;2、信号量;3、内存共享。

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/ipc.h>#include <sys/msg.h>#define MAX_TEXT 512struct 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);some_data.my_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;}}
??

热点排行