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) 注意: 1 只能用于具有亲缘关系的进程之间的通信 2 SIGPIPE信号的处理 七种进程间通信方式: 一 无名管道( pipe ) 二 有名管道( fifo ) 三 共享内存 shared memory 四 信号 ...
打印出使用消息队列进行进程间通信的信息 -s 打印出使用信号进行进程间通信的信息 参考实例 输出信息的详细变化时间: [root@linuxcool ~]# ipcs -t 输出ipc方式的进程ID: [root@linuxcool ~]# ipcs -p ...
消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来接收指定类似mtype的数据,从而实现进程间通信。 在服务器端实现广播功能,以及服务器退出...
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章 ...
消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来接收指定类似mtype的数据,从而实现进程间通信。 在服务器端实现广播功能,以及服务器退出...
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章 ...
该程序是我写的博客“一起talk C栗子吧(第九十八回:C语言实例--使用消息队列进行进程间通信二)”的配套程序,共享给大家使用
使用 posix 进程间通信 消息队列mqueue通信,C语言案例,service,client双向实现
6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么? int n; if (n == 10) // 第一种判断方式 if (10 == n) // 第二种判断方式 如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少...
1. 各种线程间通信 [跨平台]: 消息队列, 以及... 线程间各种同步机制、各种线程间/进程间通信机制,以及跨平台支持 4. 内存检测机制,支持内存泄漏发现定位,多次释放内存,释放空内存,非法内存操作,内存越界;
培训资料 进程 信号 进程间的通信 匿名管道 有名管道 内存映射 共享内存 消息队列 信号 量
1.相关博文链接:...2.内容描述:参考本代码可熟悉LinuxC作为服务端的socket网络通信、消息队列进程间通信、使用嵌入式sql调用PostgreSQL数据库、使用libxml2构造XML报文等功能。
12.3 使用pipe()实现进程间的通信 12.4 信号 12.5 例子:哲学家用餐问题 12.6 矩阵的动态分配 12.6.1 为什么二维数组无法满足要求 12.6.2 用指针数组创建矩阵 12.6.3 调整下标范围 12.6.4 一次分配所有内存 12.7 ...
1.掌握管道、信号、共享内存、消息队列等进程间通信机制; 2.能够利进程间通信机制求解一些常见问题。 二、实验预备知识 1.阅读并掌握C语言基本语法,操作。 2.熟悉Linux常用命令及使用方法。
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...
8.1 Linux下进程间通信概述 8.2 管道通信 8.3 信号通信 8.4 共享内存 8.5 消息队列 8.6 实验内容 本章小结 思考与练习 第9章 多线程编程 9.1 Linux下线程概述 9.2 Linux...
4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell的历史 2. Shell如何执行命令 2.1. 执行交互式命令 2.2. 执行脚本 3. Shell的基本语法 3.1. 变量 3.2. 文件名代换...
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 从内核...