`
acme_ltt
  • 浏览: 53563 次
  • 性别: 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下进程间通信--消息队列

    标题"Linux下进程间通信--消息队列"指出了我们讨论的核心——如何在Linux环境中利用消息队列进行进程间的通信。下面我们将深入探讨消息队列的概念、工作原理、使用方法以及提供的优点。 1. **消息队列概念**: ...

    C#进程间通信-消息队列代码实例

    本实例以C#语言为基础,详细讲解如何利用消息队列进行进程间通信。 首先,我们需要理解消息队列的基本概念。消息队列是一种存储和转发机制,它将消息从一个进程发送到另一个进程,而无需两者同时在线。消息队列的...

    进程间通信之消息队列 ( message queue )——完整代码

    进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....

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

    本示例中,我们关注的是利用消息队列这一特定的IPC机制,来实现在Linux系统下的进程间通信。消息队列提供了异步通信的能力,使得进程可以在不同时刻发送和接收消息,而无需相互等待。 首先,我们有两个进程,进程A...

    Linux下C语言编程--进程通信、消息管理

    共享内存是一种高效的进程间通信机制,它允许多个进程直接访问同一块内存区域。主要API包括: - `shmget(key_t key, size_t size, int shmflg);`:创建或获取共享内存段。 - `shmat(int shmid, void *shmaddr, int ...

    C语言进程间通信.pptx

    【C语言进程间通信】 进程间通信(IPC, Inter-Process Communication)是计算机科学中一个重要的概念,特别是在多任务和分布式系统中。它允许不同进程之间交换数据和协调执行,以实现协同工作。C语言提供了多种机制...

    queue_C语言消息队列_

    在IT领域,消息队列是一种常用于进程间通信(IPC)和系统解耦的重要机制。在C语言中,实现消息队列通常涉及到操作系统提供的API,如POSIX消息队列或Windows的消息队列API。本节将深入探讨如何使用C语言构建消息队列...

    linux下C语言编程(进程通信、消息队列)

    消息队列是进程间通信的一种形式,允许一个或多个进程向它写入消息,并由一个或多个其他进程接收这些消息。在Linux中,消息队列是通过SystemV消息队列机制实现的,主要包括msgget、msgsnd、msgrcv、msgctl等函数。...

    01-基于消息队列的进程间通信的设计

    标题中的“01-基于消息队列的进程间通信的设计”指的是一个关于使用消息队列进行进程间通信的项目或课程设计。在这个设计中,开发者可能会深入探讨如何在Linux操作系统环境下利用消息队列来实现不同进程之间的数据...

    进程间消息队列通信机制的使用

    ### 进程间消息队列通信机制的使用 ...通过以上分析,我们可以看到消息队列作为一种有效的进程间通信手段,在实际应用中具有重要的作用。无论是简单的数据传输还是复杂的任务调度,消息队列都能提供灵活而强大的支持。

    linux c 进程间通信 消息队列

    本教程将深入探讨Linux C语言中如何利用消息队列进行进程间通信,并提供亲测可用的代码示例。 首先,理解消息队列的基本概念。消息队列是一种特殊的文件系统对象,它允许一个进程发送消息到另一个进程,即使接收...

    C语言编程进阶主题-英文版

    - 系统编程技术:C语言提供了强大的系统编程能力,如进程间通信和内存管理。 4. 读者需要的基础:该书假定读者已经具有基础的编程知识,如变量、常量、赋值、选择结构(if..else)和循环结构(while, for)。同时也...

    linux进程间通信

    在Linux中,使用C语言编程时,可以调用以下函数进行进程间通信: - `pipe()` 和 `mkfifo()`:创建管道和命名管道。 - `msgget()`, `msgsnd()`, `msgrcv()`:操作消息队列。 - `sem_open()`, `sem_post()`, `sem_...

    linux c 进程间通信,使用共享内存和消息队列

    本文将深入探讨两种主要的进程间通信(IPC,Inter-Process Communication)机制:共享内存和消息队列。 **一、共享内存** 共享内存是一种允许多个进程访问同一块内存区域的IPC方式。在Linux中,可以使用`...

    C语言经典笔试面试题--自理

    - 管道和有名管道:简单、单向的数据传输方式,适用于父子进程间通信。 - 信号量:用于同步和互斥,控制多个进程对共享资源的访问。 - 消息队列:支持结构化数据,可跨进程通信。 - 信号:快速发送简短事件通知...

    linux c 进程间通信(共享内存+消息队列)

    **总结**:Linux C语言中的进程间通信,如共享内存和消息队列,提供了强大而灵活的方式让不同进程交换数据。了解并熟练运用这些机制对于开发高效、可靠的多进程应用程序至关重要。同时,开发者还需要关注相关的系统...

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

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

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

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

    Linux下C语言应用编程-作者-杨铸-配套ppt-源代码-教学大纲

    4. “14-进程间通信.ppt”:深入讨论信号、管道、消息队列、共享内存等进程间通信方式。 5. “15-多线程编程初步.ppt”:讲述线程的概念、创建与管理,以及线程同步和互斥锁的使用。 6. “16-网络编程.ppt”:讲解...

Global site tag (gtag.js) - Google Analytics