1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > linux进程内存结构体 Linux下网络编程(3)——进程间通信(IPC) 共享内存 传递结构体数据...

linux进程内存结构体 Linux下网络编程(3)——进程间通信(IPC) 共享内存 传递结构体数据...

时间:2019-03-20 20:52:20

相关推荐

linux进程内存结构体 Linux下网络编程(3)——进程间通信(IPC) 共享内存 传递结构体数据...

1. 前言

多进程,总有一些交互要做,不可能各自独立。

这里是最简单的例子。一个写入,一个读取。

一个建立共享内存,写入数据。

一个读取共享内存的内容。

2. 简单例子代码

twriter.cpp 代码如下:

#include

#include

#include

#include

#include

int main()

{

int shm_id;

int *share;

int num;

//1. 创建共享内存

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

//2. 获取共享内存在进程中的地址映射,以后可直接使用这个指针

share = (int *)shmat(shm_id, 0, 0);

while(1) {

num = random() % 1000;

//3. 直接向共享内存写入数据

*share = num;

printf("write a random number %d\n", num);

sleep(1);

}

return 0;

}

tread.cpp 代码如下:

#include

#include

#include

#include

#include

int main()

{

int shm_id;

int *share;

//1. 根据key=1234 创建或者获取共享内存

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

//2. 获取共享内存在此进程中的地址映射,以后这个指针直接指向共享内存

share = (int *)shmat(shm_id, 0, 0);

while(1) {

sleep(1);

//3. 直接使用共享内存的指针,获取里面的内容

printf("%d\n", *share);

}

return 0;

}

效果演示:

如图所示:两个进程,一个写数据,一个读数据,完成的很好。

很明显,功能已实现。

3. 共享结构体数据

重要的事情说三遍:

最核心的操作是内存复制!

最核心的操作是内存复制!

最核心的操作是内存复制!

尤其在接收端,必须要拷贝到本地的结构体中,本地化才行!!!

twriter.cpp 代码如下:

#include

#include

#include

#include

#include

#include

typedef struct

{

int i;

char ch[1];

float a;

}data, *dataprt;

int main()

{

data stu1;

stu1.i = 12;

stu1.ch[0] = 'a';

stu1.a = 1.2;

int shm_id;

dataprt share;

int num;

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

share = (dataprt)shmat(shm_id, 0, 0);

while(1) {

num = random() % 1000;

stu1.i = num;

stu1.ch[0] = 'x';

stu1.a = 12.6;

//*** 内存复制! 这是最核心的操作 ***

memcpy(share, &stu1, sizeof(stu1));

printf("write a share->i : %d\n", share->i);

printf("write a share->ch : %c\n", share->ch[0]);

printf("write a share->a : %f\n", share->a);

sleep(1);

}

return 0;

}

tread.cpp 代码如下:

#include

#include

#include

#include

#include

#include

typedef struct

{

int i;

char ch[1];

float a;

}data, *dataprt;

int main()

{

data sturead;

int shm_id;

dataprt share;

shm_id = shmget (1234, getpagesize(), IPC_CREAT);

if (shm_id == -1) {

perror("shmget()");

}

share = (dataprt)shmat(shm_id, 0, 0);

while(1) {

sleep(1);

//*** 最核心的操作,内存复制 ***

memcpy(&sturead, share, sizeof(sturead));

printf("i : %d\n", sturead.i);

printf("ch : %c\n", sturead.ch[0]);

printf("a : %f\n", sturead.a);

}

return 0;

}

效果如下:

下一步改进:

(1)不需要实时读取共享内容,需要等待信号通知,写完之后,才去读取。

---

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。