【问题标题】:Shared Memory Fork Process Learning in LinuxLinux中的共享内存fork进程学习
【发布时间】:2015-10-13 18:32:40
【问题描述】:

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

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

}

【问题讨论】:

  • 你的意思是它不起作用?有点模糊
  • 我道歉,我基本上没有从父方得到输出。从我所看到的情况来看,因为在这种情况下共享内存部分 *sd->size 没有值。所以我只是假设我在某个地方搞砸了,或者共享内存配置不正确,或者我搞砸了一些代码

标签: linux unix process fork shared-memory


【解决方案1】:

您分配给malloc 分配的内存,而不是shmget/shmat 分配的内存。我不是 100% 确定您的意图,但可能只是简单地将孩子的作业更改为以下内容就可以了。 (这将使用您在Collatz() 中初始化的mallocd 内容覆盖共享内存。)

*sd=Collatz(usr);

[编辑:我应该补充一点,您当前的代码 sd=Collatz(usr) 正在覆盖您从 shmat() 调用返回的 pointer 值,而不是指向的内存区域。]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2010-12-30
    • 2021-12-04
    • 2013-03-06
    • 2012-08-13
    • 2021-01-19
    • 2011-02-10
    • 2015-06-25
    相关资源
    最近更新 更多