c语言共享内存,在爷儿俩进程间使用共享内存(共享内容含指针)

在父子进程间使用共享内存(共享内容含指针)

比如有这样一个结构体

#define MAX_QUE_LEN 100

//定义数据包缓存队列

typedef struct _t_pkt_queue

{

UINT4       V6_out_head;

UINT4       V6_out_tail;

UINT4       V6_out_curcnt;

tEthpkt *   V6_out_queue[MAX_QUE_LEN];

}tPktQue;

tEthpkt  *  是指向一个数据包的指针。

在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空,但是为什么不能对其进行操作?

------解决思路----------------------

引用:比如有这样一个结构体

#define MAX_QUE_LEN 100

//定义数据包缓存队列

typedef struct _t_pkt_queue

{

UINT4       V6_out_head;

UINT4       V6_out_tail;

UINT4       V6_out_curcnt;

tEthpkt *   V6_out_queue[MAX_QUE_LEN];

}tPktQue;

tEthpkt  *  是指向一个数据包的指针。

在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空,但是为什么不能对其进行操作?

Linux下在父进程用mmap创建匿名共享内存,共享内存的地址在父进程和子进程是一样的,父子进程都可以直接修改共享内存中的数据。

你说的子进程不能对其进行操作是什么意思?是取不到想要的数据还是修改了数据父进程看不见?

你是怎么创建共享内存的?

------解决思路----------------------

引用:Quote: 引用:Quote: 引用:比如有这样一个结构体

#define MAX_QUE_LEN 100

//定义数据包缓存队列

typedef struct _t_pkt_queue

{

UINT4       V6_out_head;

UINT4       V6_out_tail;

UINT4       V6_out_curcnt;

tEthpkt *   V6_out_queue[MAX_QUE_LEN];

}tPktQue;

tEthpkt  *  是指向一个数据包的指针。

在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空,但是为什么不能对其进行操作?

Linux下在父进程用mmap创建匿名共享内存,共享内存的地址在父进程和子进程是一样的,父子进程都可以直接修改共享内存中的数据。

你说的子进程不能对其进行操作是什么意思?是取不到想要的数据还是修改了数据父进程看不见?

你是怎么创建共享内存的?

shmid = shmget(IPC_PRIVATE, sizeof(tPktQue), IPC_CREAT

------解决思路----------------------

0660);

if(shmid <= 0)

{

printf("\n***Create a shared memory Fail!\n");

return -1;

}

stacksize = getpagesize();

stack = malloc(stacksize);

if(stack == NULL)

{

printf("\n***Malloc For Child Process stack Failed!\n");

return -1;

}

childstack = stack + stacksize;

flags = CLONE_NEWPID

------解决思路----------------------

CLONE_NEWNS;

pid = clone(vdev_func, childstack, flags, (void *)shmid);

shmaddr = (char *)shmat(shmid, NULL, 0);

PktQue[i] = (tPktQue *)shmaddr;   //这里PktQue[i] 是一个指向tPktQue  的指针。

vdev_func子进程的调用函数。

在子进程中

shmaddr = (char *)shmat(shmid, NULL, 0);

PktQue[i] = (tPktQue *)shmaddr;

比如对 PktQue[i] ->V6_out_queue[0]操作。操作不了。但其不为空。

你都用clone了,可以不用shmget和shmat了。看一下我写的测试代码:

#define _GNU_SOURCE

#include 

#include 

#include 

#include 

int data = 10;

char *str = NULL;

int child_process(void *args)

{

printf("Child process %d, data %d, str: %s\n", getpid(), data, str);

data = 20;

str = "child str";

printf("Child process %d, data %d, str: %s\n", getpid(), data, str);

while (1) {

sleep(1);

}

}

int main(int argc, char *argv[])

{

void *stack = (void *)malloc(16384);

int clone_flag = CLONE_VM

------解决思路----------------------

CLONE_SIGHAND

------解决思路----------------------

CLONE_FS

------解决思路----------------------

CLONE_FILES;

str = "parent str";

clone(child_process, stack+16384, clone_flag, NULL);

printf("Parent process %d, data %d, str: %s\n", getpid(), data, str);

sleep(1);

while (1) {

sleep(1);

}

return 0;

}

运行后输出:

Child process 4517, data 10, str: parent str

Child process 4517, data 20, str: child str

Parent process 4516, data 20, str: child str

------解决思路----------------------

引用:Quote: 引用:Quote: 引用:Quote: 引用:比如有这样一个结构体

#define MAX_QUE_LEN 100

//定义数据包缓存队列

typedef struct _t_pkt_queue

{

UINT4       V6_out_head;

UINT4       V6_out_tail;

UINT4       V6_out_curcnt;

tEthpkt *   V6_out_queue[MAX_QUE_LEN];

}tPktQue;

tEthpkt  *  是指向一个数据包的指针。

在父子进程间将其共享。在子进程中 (tEthpkt *)指针不为空,但是为什么不能对其进行操作?

Linux下在父进程用mmap创建匿名共享内存,共享内存的地址在父进程和子进程是一样的,父子进程都可以直接修改共享内存中的数据。

你说的子进程不能对其进行操作是什么意思?是取不到想要的数据还是修改了数据父进程看不见?

你是怎么创建共享内存的?

shmid = shmget(IPC_PRIVATE, sizeof(tPktQue), IPC_CREAT

------解决思路----------------------

0660);

if(shmid <= 0)

{

printf("\n***Create a shared memory Fail!\n");

return -1;

}

stacksize = getpagesize();

stack = malloc(stacksize);

if(stack == NULL)

{

printf("\n***Malloc For Child Process stack Failed!\n");

return -1;

}

childstack = stack + stacksize;

flags = CLONE_NEWPID

------解决思路----------------------

CLONE_NEWNS;

pid = clone(vdev_func, childstack, flags, (void *)shmid);

shmaddr = (char *)shmat(shmid, NULL, 0);

PktQue[i] = (tPktQue *)shmaddr;   //这里PktQue[i] 是一个指向tPktQue  的指针。

vdev_func子进程的调用函数。

在子进程中

shmaddr = (char *)shmat(shmid, NULL, 0);

PktQue[i] = (tPktQue *)shmaddr;

比如对 PktQue[i] ->V6_out_queue[0]操作。操作不了。但其不为空。

你都用clone了,可以不用shmget和shmat了。看一下我写的测试代码:

#define _GNU_SOURCE

#include 

#include 

#include 

#include 

int data = 10;

char *str = NULL;

int child_process(void *args)

{

printf("Child process %d, data %d, str: %s\n", getpid(), data, str);

data = 20;

str = "child str";

printf("Child process %d, data %d, str: %s\n", getpid(), data, str);

while (1) {

sleep(1);

}

}

int main(int argc, char *argv[])

{

void *stack = (void *)malloc(16384);

int clone_flag = CLONE_VM

------解决思路----------------------

CLONE_SIGHAND

------解决思路----------------------

CLONE_FS

------解决思路----------------------

CLONE_FILES;

str = "parent str";

clone(child_process, stack+16384, clone_flag, NULL);

printf("Parent process %d, data %d, str: %s\n", getpid(), data, str);

sleep(1);

while (1) {

sleep(1);

}

return 0;

}

运行后输出:

Child process 4517, data 10, str: parent str

Child process 4517, data 20, str: child str

Parent process 4516, data 20, str: child str

错了,sleep(1)是让子进程先运行再打印,应该在第29行printf之前:

#define _GNU_SOURCE

#include 

#include 

#include 

#include 

int data = 10;

char *str = NULL;

int child_process(void *args)

{

printf("Child process %d, data %d, str: %s\n", getpid(), data, str);

data = 20;

str = "child str";

printf("Child process %d, data %d, str: %s\n", getpid(), data, str);

while (1) {

sleep(1);

}

}

int main(int argc, char *argv[])

{

void *stack = (void *)malloc(16384);

int clone_flag = CLONE_VM

------解决思路----------------------

CLONE_SIGHAND

------解决思路----------------------

CLONE_FS

------解决思路----------------------

CLONE_FILES;

str = "parent str";

clone(child_process, stack+16384, clone_flag, NULL);

sleep(1);

printf("Parent process %d, data %d, str: %s\n", getpid(), data, str);

while (1) {

sleep(1);

}

return 0;

}

------解决思路----------------------

引用:如果我现在要创建8个子进程,每个子进程与父进程之间有一个共享区域。要做到它们相互隔离。这=这样会不会有问题?

我推荐你还是在父进程mmap一块匿名共享内存,然后fork出子进程,这样子进程也可以共享父进程创建的共享内存,而且指针也一样,可以把共享内存中的指针保存到共享内存中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值