叉的共享内存

我想在两个进程之间创build一个共享内存。 我用fork()。 一个孩子试图改变这个共享的记忆,母亲创造另一个孩子,所以新的孩子试图改变相同的记忆等等。 这里是我在C编程的代码。 (Ubuntu的)

mylist ch=NUL; f=fork(); if(!f){ pba=shmget(KEYSHM,sizeof(char),0); /*created shared memory*/ ch=(mylist *) shmat(pba,0,0); ch->name=ugur; ch->surname=cedric; ...do something... } else{ if(ch) printf("this is top of mylist %s"ch->name); .......do something } 

它从不写ch->名字。 为什么? 我创build了一个共享内存。 为什么父进程无法读取?

为了共享内存,父级和子级都必须访问相同的共享内存。

你有两个选择,更简单和更难:

  • 在分叉之前创建并附加到共享内存。 父母和孩子都可以自动访问相同的共享内存。

  • 首先分叉,然后父母和孩子必须分别附加到共享内存。 一旦进程分叉了,它们就不再共享内存了,特别是在父进程中不能访问在子进程中分配的任何东西。

您需要分配超过1个字符的共享内存来存储有用的字符串,如名称。

你有一个竞争条件,如果父母在孩子面前跑,你试图访问ch->在孩子已经放置什么之前呢?

你也只分配一个字节(sizeof(char)),但是你想把它当作一个指向结构体的指针 – 你需要为mylist分配足够的空间 – 除非你这么做了。 你也需要IPC_CREAT标志来改变某个地方。

如果第一次运行父进程不能访问ch->name因为ch->name=ugur; 还没有运行。我建议看到这个教程共享内存和这个pdf文件 。
一个解决方案,我认为在fork()之前获得共享内存,并在子和父级中使用它。

你写代码的方式,ch将指向一些共享内存,但是ch本身(即指针)不共享。 因为ch的赋值只发生在child中,所以parent将继续看到ch为NULL。

你有两种方法来解决这个问题:

  1. 在fork之前设置共享内存。
  2. 让父母和孩子都打开相同的共享内存。

处理共享内存中的记录时,需要确保该记录的所有数据都存在共享内存中。 例如,在这个代码中:

  ch->name=ugur; ch->surname=cedric; 

看来,mylist :: name是一个char *。 如果ch指向共享内存中的记录,则只会将指向名称的指针放在共享内存中。 除非你采取了特定的步骤把这些字符串放到共享内存中,否则它们将在正常的内存中,并且可能无法被其他程序访问。

如果我创建并附加共享内存之前分叉,然后我无法检查共享内存是否为NULL。 附加时启动。

你也使用了0作为你的标志,这些标志指定了访问权限以及是否应该创建共享内存段。 换句话说,你没有给自己读或写访问权限,也没有指定要创建的段如果还不存在。