锁定老帖子 主题:C语言进程间通信--消息队列
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-29
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 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); 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; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 8686 次