在父子进程间使用共享内存(共享内容含指针)
比如有这样一个结构体
#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出子进程,这样子进程也可以共享父进程创建的共享内存,而且指针也一样,可以把共享内存中的指针保存到共享内存中。