通过共享内存,实现两个进程A,B之间的通信
2013-07-30 17:35
741 查看
进程A:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>
#define SHM_SIZE 4096
#define SHM_MODE (SHM_R | SHM_W) /* user read/write */
/*定义一个结构体*/
typedef struct
{
char buf[255];
int tag;
}shminfo;
int main(void)
{
int shmid;
char *shmptr;
shminfo *pnode;
if ( (shmid = shmget(0x44, SHM_SIZE, SHM_MODE | IPC_CREAT)) < 0)
perror("shmget");
if ( (shmptr = shmat(shmid, 0, 0)) == (void *) -1)
perror("shmat");
pnode = (shminfo *)shmptr;
memset(pnode,0,sizeof(shminfo)); ));/*这一句非常重要,为什么呢?这涉及到
下面while循环中的内容,在下面的while中,我们约定当tag的标志为0x12时,进程
B读取进程A往共享内存中所写的内容,如果不用这个函数,那么在while循环中,
就无法进入if语句,那么在写过一次数据之后就无法在写入其它数据了。(我当时
不知道怎么回事,写入一次后就出现这种情况,后来又把这条语句注释掉,可是
再也没有碰到过这种情况,后面我仔细思考了一下,在进程B读取数据完后,我
在后面加了memset这条语句,按道理是不会出现这种情况了,当时真不知道是
怎么回事了,下次要及时记录。)*/
/* 往共享内存写数据 */
while(1)
{
sleep(1);
if(pnode->tag!=0x12)
{
printf("请输入要写进共享内存中的数据:\n");
scanf("%s",pnode->buf);
pnode->tag = 0x12;
}
}
exit(0);
}
进程B:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>
#define SHM_SIZE 4096
#define SHM_MODE (SHM_R|SHM_W|IPC_CREAT)
typedef struct
{
char buf[255];
int tag;
}shminfo;
int main(void)
{
int shmid;
char *shmptr;
shminfo *pnode;
if((shmid = shmget(0x44,SHM_SIZE,SHM_MODE|IPC_CREAT))<0)
perror("shmget");
if ((shmptr = shmat(shmid,0,0))==(void*)-1)
perror("shmat");
pnode = (shminfo *)shmptr;
while(1)
{
sleep(1);
if(pnode->tag==0x12)
{
printf("从共享内存中读出的数据是:%s\n",pnode->buf);
memset(pnode,0x00,sizeof(shminfo));
}
}
exit(0);
}
在解释这两个进程之前,先解释一下memset这个函数,它的作用是在一段内存中填
充某个给定的值,它是对较大的结构体或者数组进行清零操作的一种最快方法。举个例
子,如果你要把char a[20]这个数组清零,就可以使用memset(a,0,20)。这样就把这
个数组清零了。 现在解释一下这两个进程间到底在干什么?进程A通过shmget这个函数
创建一块新的内存空间,再通过shmat把这个新建的内存空间挂载起来,即允许其他进程
对这个新建的内存空间访问。
进程A,B实现的功能是,进程A往共享内存中写数据,约定一个tag,当这个tag为某个
特定的值时,进程B读取数据(进程B每隔一段时间扫描一次),B读完之后,再修改这个
tag值,告诉进程A(进程A每隔一段时间扫描一次),我已经读完了,进程A通过判断这
个tag值决定是否往共享内存中写入数据。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>
#define SHM_SIZE 4096
#define SHM_MODE (SHM_R | SHM_W) /* user read/write */
/*定义一个结构体*/
typedef struct
{
char buf[255];
int tag;
}shminfo;
int main(void)
{
int shmid;
char *shmptr;
shminfo *pnode;
if ( (shmid = shmget(0x44, SHM_SIZE, SHM_MODE | IPC_CREAT)) < 0)
perror("shmget");
if ( (shmptr = shmat(shmid, 0, 0)) == (void *) -1)
perror("shmat");
pnode = (shminfo *)shmptr;
memset(pnode,0,sizeof(shminfo)); ));/*这一句非常重要,为什么呢?这涉及到
下面while循环中的内容,在下面的while中,我们约定当tag的标志为0x12时,进程
B读取进程A往共享内存中所写的内容,如果不用这个函数,那么在while循环中,
就无法进入if语句,那么在写过一次数据之后就无法在写入其它数据了。(我当时
不知道怎么回事,写入一次后就出现这种情况,后来又把这条语句注释掉,可是
再也没有碰到过这种情况,后面我仔细思考了一下,在进程B读取数据完后,我
在后面加了memset这条语句,按道理是不会出现这种情况了,当时真不知道是
怎么回事了,下次要及时记录。)*/
/* 往共享内存写数据 */
while(1)
{
sleep(1);
if(pnode->tag!=0x12)
{
printf("请输入要写进共享内存中的数据:\n");
scanf("%s",pnode->buf);
pnode->tag = 0x12;
}
}
exit(0);
}
进程B:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>
#define SHM_SIZE 4096
#define SHM_MODE (SHM_R|SHM_W|IPC_CREAT)
typedef struct
{
char buf[255];
int tag;
}shminfo;
int main(void)
{
int shmid;
char *shmptr;
shminfo *pnode;
if((shmid = shmget(0x44,SHM_SIZE,SHM_MODE|IPC_CREAT))<0)
perror("shmget");
if ((shmptr = shmat(shmid,0,0))==(void*)-1)
perror("shmat");
pnode = (shminfo *)shmptr;
while(1)
{
sleep(1);
if(pnode->tag==0x12)
{
printf("从共享内存中读出的数据是:%s\n",pnode->buf);
memset(pnode,0x00,sizeof(shminfo));
}
}
exit(0);
}
在解释这两个进程之前,先解释一下memset这个函数,它的作用是在一段内存中填
充某个给定的值,它是对较大的结构体或者数组进行清零操作的一种最快方法。举个例
子,如果你要把char a[20]这个数组清零,就可以使用memset(a,0,20)。这样就把这
个数组清零了。 现在解释一下这两个进程间到底在干什么?进程A通过shmget这个函数
创建一块新的内存空间,再通过shmat把这个新建的内存空间挂载起来,即允许其他进程
对这个新建的内存空间访问。
进程A,B实现的功能是,进程A往共享内存中写数据,约定一个tag,当这个tag为某个
特定的值时,进程B读取数据(进程B每隔一段时间扫描一次),B读完之后,再修改这个
tag值,告诉进程A(进程A每隔一段时间扫描一次),我已经读完了,进程A通过判断这
个tag值决定是否往共享内存中写入数据。
相关文章推荐
- 通过共享内存,利用循环队列实现两个进程A,B之间的通信
- linux下通过共享内存在进程之间实现通信(system V)
- 两个或多个进程之间通过Win32 API实现内存共享的方法(转)
- UNIX环境高级编程学习之第十五章进程间通信 - 两个进程通过映射普通文件实现共享内存通信
- 两个或多个进程之间通过Win32 API实现内存共享的方法(转)
- 通过共享内存和信号量实现进程间的通信
- php-通过共享内存实现消息队列和进程通信
- 直接读取进程内存实现两个应用程序之间的通信
- 通过内存映射文件实现进程间数据共享
- LINUX 实现两个进程之间的通信
- linux下的多进程通信(IPC)原理及实现方案(管道、队列、信号量、共享内存)
- 使用pipe()与fork()函数通过管道实现父子进程之间的通信
- 使用管道实现两个进程之间的通信
- 通过信号量和共享内存实现h264码流在不同进程间传输
- 进程通信----共享内存以及mmap函数实现共享内存
- Linux初学,利用共享内存,有名管道,select实现两个用户之间的自由对话。
- linux两个程序通过共享内存通信的一个简单例子
- 利用共享内存实现进程之间的通讯
- 使用共享实现两个进程之间的聊天-使用有名信号量实现同步
- Linux进程通信---共享内存 代码实现