Linux中的共享内存Fork进程学习
大家好!我只是想通过fork()函数进一步了解Linux中的父进程和子进程。 我正在尝试制作一个非常简单的程序,在设置了共享内存段之后,我可以从子级获得一个结果,并将其输出到父级。 我的问题是它似乎不起作用。这是我到目前为止所拥有的Linux中的共享内存Fork进程学习,linux,unix,process,fork,shared-memory,Linux,Unix,Process,Fork,Shared Memory,大家好!我只是想通过fork()函数进一步了解Linux中的父进程和子进程。 我正在尝试制作一个非常简单的程序,在设置了共享内存段之后,我可以从子级获得一个结果,并将其输出到父级。 我的问题是它似乎不起作用。这是我到目前为止所拥有的 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/shm.h> #include <sys/stat.h&
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>
#define SZ 20
typedef struct
{
int size;
int cz[SZ];
}shared_data;
shared_data* Collatz(int);
int main (void)
{
pid_t pid;
int seg_id,size=sizeof(shared_data);
seg_id=shmget(IPC_PRIVATE,size,S_IRUSR | S_IWUSR);
shared_data *sd=(shared_data *)shmat(seg_id,NULL, 0);
int usr=-1,count,i;
while(usr<1 ||usr >9)
{
printf("Please Enter a Number between 1-9:");
scanf("%d",&usr);
}
pid=fork();
if(pid<0)
{
printf("Fork Failed");
return 1;
}
if(pid==0)
{
sd=Collatz(usr);
shmdt(sd);
}
else
{
wait(NULL);
printf("\nThe Sequence is: %d ",count);
for(i=0;i<sd->size;i++)
{
printf(" %d ",sd->cz[i]);
}
printf("\n");
}
return 0;
}
shared_data* Collatz(int val)
{
int i=0;
shared_data *data=malloc(sizeof(shared_data));
data->cz[i]=val;
while(val!=1)
{
i++;
if(val%2==0)
val=val/2;
else
val=(3*val)+1;
data->cz[i]=val;
}
data->size=i;
return data;
#包括
#包括
#包括
#包括
#包括
#包括
#定义SZ 20
类型定义结构
{
整数大小;
int cz[SZ];
}共享数据;
共享数据*Collatz(int);
内部主(空)
{
pid_t pid;
int seg_id,size=sizeof(共享_数据);
seg_id=shmget(IPC_私有,大小,S_IRUSR | S_IWUSR);
共享数据*sd=(共享数据*)shmat(seg\u id,NULL,0);
int usr=-1,计数,i;
while(usr9)
{
printf(“请输入一个介于1-9之间的数字:”);
scanf(“%d”和&usr);
}
pid=fork();
if(pidcz[i]);
}
printf(“\n”);
}
返回0;
}
共享数据*Collatz(int-val)
{
int i=0;
共享_数据*数据=malloc(sizeof(共享_数据));
数据->cz[i]=val;
while(val!=1)
{
i++;
如果(值%2==0)
val=val/2;
其他的
val=(3*val)+1;
数据->cz[i]=val;
}
数据->大小=i;
返回数据;
}您正在分配给使用
malloc
分配的内存,而不是使用shmget
/shmat
分配的内存。我不是100%确定你的意图,但可能只是简单地将孩子的作业更改为以下内容就可以了。(这将使用您在Collatz()
中初始化的malloc
d内容覆盖共享内存)
[编辑:我应该补充一点,您当前的代码
sd=Collatz(usr)
正在覆盖从shmat()
调用返回的指针值,而不是指向内存区域的指针值。]这是什么意思?我很抱歉,我基本上没有从父端得到输出。从我看来,这是因为本例中的共享内存部分*sd->size没有值。所以我只是假设我把某个地方搞砸了,或者共享内存配置不正确,或者我把一些代码搞砸了
*sd=Collatz(usr);