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

1. 前言

多进程,总有一些交互要做,不可能各自独立。
这里是最简单的例子。一个写入,一个读取。

一个建立共享内存,写入数据。
一个读取共享内存的内容。

2. 简单例子代码

twriter.cpp 代码如下:
#include<stdio.h>
#include<unistd.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<error.h>

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<stdio.h>
#include<unistd.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<error.h>

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 <stdio.h>
#include <unistd.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <error.h>
#include <string.h>

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 <stdio.h>
#include <unistd.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <error.h>
#include <string.h>

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)不需要实时读取共享内容,需要等待信号通知,写完之后,才去读取。



---



展开阅读全文

没有更多推荐了,返回首页