【发布时间】:2013-03-29 19:07:33
【问题描述】:
所以基本上我想在子进程创建后暂停一点,这样父进程就可以在共享内存中为它准备一些数据。我正在尝试使用信号量,如下所示:How to share semaphores between processes using shared memory。
问题 nr 1:孩子无法打开信号量。
问题 nr 2:strerror 返回一个 int,但 man strerror 明确表示它返回一个 char *。
为了避免“你尝试过什么”:
sem = sem_open("/semaphore", O_CREAT, 0644, 0);
for (i = 0; i < num; i++)
{
pid = fork();
if (pid == 0)
{
sem = sem_open("/semaphore", 0);
if (sem == SEM_FAILED)
{
printf( "Error : %d\n", strerror(errno ));
exit(0);
}
sem_wait(sem);
exit(0);
}
}
prepare_data_for_child_processes();
for (i = 0; i < mpi_comm_world->np; i++)
sem_post(sem);
sem_close(sem);
sem_unlink("/semaphore");
【问题讨论】:
-
名称前面的
/是有意的吗? -
@bash.d,是的,我在一个例子中发现了这一点,并发现这并不重要。我更改了信号量的名称,但问题仍然存在。
-
可能是并发问题?
sem_open会立即阻塞还是失败? -
如果
strerror()返回int,这意味着(1)你忽略了编译器警告和(2)你忘了#include <string.h> -
@gg.kaspersky 抱歉,没注意到它超载了。关于您的问题,您是否尝试过在删除信号量之前在主进程中等待?也许它在孩子有机会使用它之前就被删除了。