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环境中利用消息队列进行进程间的通信。下面我们将深入探讨消息队列的概念、工作原理、使用方法以及提供的优点。 1. **消息队列概念**: ...
本实例以C#语言为基础,详细讲解如何利用消息队列进行进程间通信。 首先,我们需要理解消息队列的基本概念。消息队列是一种存储和转发机制,它将消息从一个进程发送到另一个进程,而无需两者同时在线。消息队列的...
进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....
本示例中,我们关注的是利用消息队列这一特定的IPC机制,来实现在Linux系统下的进程间通信。消息队列提供了异步通信的能力,使得进程可以在不同时刻发送和接收消息,而无需相互等待。 首先,我们有两个进程,进程A...
共享内存是一种高效的进程间通信机制,它允许多个进程直接访问同一块内存区域。主要API包括: - `shmget(key_t key, size_t size, int shmflg);`:创建或获取共享内存段。 - `shmat(int shmid, void *shmaddr, int ...
【C语言进程间通信】 进程间通信(IPC, Inter-Process Communication)是计算机科学中一个重要的概念,特别是在多任务和分布式系统中。它允许不同进程之间交换数据和协调执行,以实现协同工作。C语言提供了多种机制...
在IT领域,消息队列是一种常用于进程间通信(IPC)和系统解耦的重要机制。在C语言中,实现消息队列通常涉及到操作系统提供的API,如POSIX消息队列或Windows的消息队列API。本节将深入探讨如何使用C语言构建消息队列...
消息队列是进程间通信的一种形式,允许一个或多个进程向它写入消息,并由一个或多个其他进程接收这些消息。在Linux中,消息队列是通过SystemV消息队列机制实现的,主要包括msgget、msgsnd、msgrcv、msgctl等函数。...
标题中的“01-基于消息队列的进程间通信的设计”指的是一个关于使用消息队列进行进程间通信的项目或课程设计。在这个设计中,开发者可能会深入探讨如何在Linux操作系统环境下利用消息队列来实现不同进程之间的数据...
### 进程间消息队列通信机制的使用 ...通过以上分析,我们可以看到消息队列作为一种有效的进程间通信手段,在实际应用中具有重要的作用。无论是简单的数据传输还是复杂的任务调度,消息队列都能提供灵活而强大的支持。
本教程将深入探讨Linux C语言中如何利用消息队列进行进程间通信,并提供亲测可用的代码示例。 首先,理解消息队列的基本概念。消息队列是一种特殊的文件系统对象,它允许一个进程发送消息到另一个进程,即使接收...
- 系统编程技术:C语言提供了强大的系统编程能力,如进程间通信和内存管理。 4. 读者需要的基础:该书假定读者已经具有基础的编程知识,如变量、常量、赋值、选择结构(if..else)和循环结构(while, for)。同时也...
在Linux中,使用C语言编程时,可以调用以下函数进行进程间通信: - `pipe()` 和 `mkfifo()`:创建管道和命名管道。 - `msgget()`, `msgsnd()`, `msgrcv()`:操作消息队列。 - `sem_open()`, `sem_post()`, `sem_...
本文将深入探讨两种主要的进程间通信(IPC,Inter-Process Communication)机制:共享内存和消息队列。 **一、共享内存** 共享内存是一种允许多个进程访问同一块内存区域的IPC方式。在Linux中,可以使用`...
- 管道和有名管道:简单、单向的数据传输方式,适用于父子进程间通信。 - 信号量:用于同步和互斥,控制多个进程对共享资源的访问。 - 消息队列:支持结构化数据,可跨进程通信。 - 信号:快速发送简短事件通知...
**总结**:Linux C语言中的进程间通信,如共享内存和消息队列,提供了强大而灵活的方式让不同进程交换数据。了解并熟练运用这些机制对于开发高效、可靠的多进程应用程序至关重要。同时,开发者还需要关注相关的系统...
进程间通信之无名管道(pipe) 注意: 1 只能用于具有亲缘关系的进程之间的通信 2 SIGPIPE信号的处理 七种进程间通信方式: 一 无名管道( pipe ) 二 有名管道( fifo ) 三 共享内存 shared memory 四 信号 ...
打印出使用消息队列进行进程间通信的信息 -s 打印出使用信号进行进程间通信的信息 参考实例 输出信息的详细变化时间: [root@linuxcool ~]# ipcs -t 输出ipc方式的进程ID: [root@linuxcool ~]# ipcs -p ...
4. “14-进程间通信.ppt”:深入讨论信号、管道、消息队列、共享内存等进程间通信方式。 5. “15-多线程编程初步.ppt”:讲述线程的概念、创建与管理,以及线程同步和互斥锁的使用。 6. “16-网络编程.ppt”:讲解...