我正在使用fork()编写一个程序来生成Fibonacci序列,这样如果我在命令行中传递8,则输出为: 0,1,1,2,3,5,8,13,21 并有这个输出
下一步我试图让它使用Posix共享内存在父级和子级之间共享,但是它们之间没有共享数据,这是我的代码:
pid = fork();
if (pid == 0)
{ /* create the shared memory object */
shm_fib = shm_open(name, O_CREAT | O_RDWR, 0666);
/* configure the size of the shared memory object */
ftruncate(shm_fib, SIZE);
/* memory map the shared memory object */
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fib, 0);
printf("Child is producing the Fibonacci Sequence...\n");
sprintf(ptr,"%d, %d,",f1,f2);
ptr++;
for (i=2;i<n;i++)
{
sum=f1+f2;
sprintf(ptr,"%d, ", sum);
ptr++;
f1=f2;
f2=sum;
}
printf("Child ends\n");
}
else
{ wait(NULL);
/* open the shared memory object */
shm_fib = shm_open(name, O_RDONLY, 0666);
if (shm_fib == -1)
{
printf("shared memory failed\n");
exit(-1);
}
/* memory map the shared memory object */
ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fib, 0);
printf("Parent is waiting for child to complete...\n");
/* read from the shared memory object */
printf("%s",(char *)ptr);
/* remove the shared memory object */
shm_unlink(name);
printf("Parent ends\n");
}
这是输出:
plz, Enter the value of number to show the fibonacci sequence:
9
Child is producing the Fibonacci Sequence...
Child ends
shared memory failed
任何人都可以帮助我知道为什么共享内存失败了?!?
答案 0 :(得分:4)
始终打印<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="{Binding Color1.Color}" />
</Setter.Value>
</Setter>
或致电errno
以查看确切错误。这将告诉你错误是&#34;没有这样的文件或目录&#34;。这是由代码末尾的perror
引起的。在父母有机会完成对共享内存的使用之前,shm_unlink
可以(通常是)由孩子执行。如果不明显,手册页会说明shm_unlink
:
成功shm_unlink()后,尝试shm_open()一个对象 具有相同名称将失败
建议您删除该代码。不要认为它是必需的,因为父进程代码已经有一个(更有效)shm_unlink
。
更新:事实上,保证在父使用共享内存之前执行shm_unlink
。因为父(正确)有一个shm_unlink
供孩子完成。
答案 1 :(得分:1)
当您分叉但不执行时,您可以在分叉前mmap
MAP_ANONYMOUS
(或使用/dev/zero
)MAP_SHARED
映射。该区域将在两个流程之间共享:
// Error handling omitted for brevity
void* ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, -1, 0);
pid_t pid = fork();
if (pid == 0) {
// [...] Write the shared memory
} else {
wait(NULL);
// [...] Read the shared memory
}