`
acme_ltt
  • 浏览: 52222 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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 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;
	}
}
   
分享到:
评论

相关推荐

    利用消息队列实现进程间通信

    利用消息队列基本函数,实现Linux系统下进程A和进程B之间的消息收发。 msgsend输入‘end’,退出程序

    进程间通信之无名管道(pipe) 完整代码

    进程间通信之无名管道(pipe) 注意: 1 只能用于具有亲缘关系的进程之间的通信 2 SIGPIPE信号的处理 七种进程间通信方式: 一 无名管道( pipe ) 二 有名管道( fifo ) 三 共享内存 shared memory 四 信号 ...

    ipcs命令 多进程间通信常用的工具

    打印出使用消息队列进行进程间通信的信息 -s 打印出使用信号进行进程间通信的信息 参考实例 输出信息的详细变化时间: [root@linuxcool ~]# ipcs -t 输出ipc方式的进程ID: [root@linuxcool ~]# ipcs -p ...

    亲测可用基于Linux消息队列的简易聊天室(C语言).zip

    消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来接收指定类似mtype的数据,从而实现进程间通信。 在服务器端实现广播功能,以及服务器退出...

    用C语言开发手机软件 -Windows+CE+6.0开发者参考

    8.7 进程间通信 8.7.1 查找其他进程 8.7.2 WM-COPYDATA 8.7.3 命名内存映射对象 8.7.4 点对点消息队列 8.7.5 使用文件和数据库通信 8.8 XTalk示例程序 8.9 异常处理 8.9.1 C++异常处理 8.9.2 Win32异常处理 第9章 ...

    基于Linux消息队列的简易聊天室(C语言)(附源代码)

    消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来接收指定类似mtype的数据,从而实现进程间通信。 在服务器端实现广播功能,以及服务器退出...

    用C语言开发手机软件-Windows CE 6.0开发者参考

    8.7 进程间通信 8.7.1 查找其他进程 8.7.2 WM-COPYDATA 8.7.3 命名内存映射对象 8.7.4 点对点消息队列 8.7.5 使用文件和数据库通信 8.8 XTalk示例程序 8.9 异常处理 8.9.1 C++异常处理 8.9.2 Win32异常处理 第9章 ...

    IPC消息队列

    该程序是我写的博客“一起talk C栗子吧(第九十八回:C语言实例--使用消息队列进行进程间通信二)”的配套程序,共享给大家使用

    NmIpc-source.rar

    使用 posix 进程间通信 消息队列mqueue通信,C语言案例,service,client双向实现

    c++ 面试题 总结

    6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么? int n; if (n == 10) // 第一种判断方式 if (10 == n) // 第二种判断方式 如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少...

    my lib [各种用途的C语言库]

    1. 各种线程间通信 [跨平台]: 消息队列, 以及... 线程间各种同步机制、各种线程间/进程间通信机制,以及跨平台支持 4. 内存检测机制,支持内存泄漏发现定位,多次释放内存,释放空内存,非法内存操作,内存越界;

    Unix进程与进程通信

    培训资料 进程 信号 进程间的通信 匿名管道 有名管道 内存映射 共享内存 消息队列 信号 量

    C语言实现Linux服务端的记账本程序

    1.相关博文链接:...2.内容描述:参考本代码可熟悉LinuxC作为服务端的socket网络通信、消息队列进程间通信、使用嵌入式sql调用PostgreSQL数据库、使用libxml2构造XML报文等功能。

    C语言解析教程(原书第4版)(美) 凯利.pdf

    12.3 使用pipe()实现进程间的通信 12.4 信号 12.5 例子:哲学家用餐问题 12.6 矩阵的动态分配 12.6.1 为什么二维数组无法满足要求 12.6.2 用指针数组创建矩阵 12.6.3 调整下标范围 12.6.4 一次分配所有内存 12.7 ...

    《linux编程技术》-实验4.docx

    1.掌握管道、信号、共享内存、消息队列等进程间通信机制; 2.能够利进程间通信机制求解一些常见问题。 二、实验预备知识 1.阅读并掌握C语言基本语法,操作。 2.熟悉Linux常用命令及使用方法。

    Linux内核情景分析(非扫描版)

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...

    Linux内核情景分析

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...

    华清远见嵌入式linux应用程序开发技术详解下载(内部资料).rar

     8.1 Linux下进程间通信概述   8.2 管道通信   8.3 信号通信  8.4 共享内存   8.5 消息队列  8.6 实验内容   本章小结   思考与练习 第9章 多线程编程   9.1 Linux下线程概述   9.2 Linux...

    宋劲彬的嵌入式C语言一站式编程

    4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell的历史 2. Shell如何执行命令 2.1. 执行交互式命令 2.2. 执行脚本 3. Shell的基本语法 3.1. 变量 3.2. 文件名代换...

    FreeBSD操作系统设计与实现

    2.11 进程间通信 2.12 网络通信 2.13 网络实现 2.14 系统运行 2.15 复习题 2.16 参考文献 第3章 内核服务 3.1 内核结构 3.1.1 系统进程 3.1.2 系统入口 3.1.3 运行时刻的内核结构 3.1.4 内核的入口 3.1.5 从内核...

Global site tag (gtag.js) - Google Analytics