Linux中的共享内存Fork进程学习

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&

大家好!我只是想通过fork()函数进一步了解Linux中的父进程和子进程。 我正在尝试制作一个非常简单的程序,在设置了共享内存段之后,我可以从子级获得一个结果,并将其输出到父级。 我的问题是它似乎不起作用。这是我到目前为止所拥有的

#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);