【发布时间】:2020-07-20 18:55:23
【问题描述】:
我在使用 POSIX 信号量来释放分叉进程时遇到问题。通过在fork 和exec 之后调用正在运行的进程的另一个实例来启动分叉进程。有时孩子会被释放,有时则不会。
这是一个名为 semaphore 的 POSIX 共享内存,奇怪的是它有时会起作用。我检查了那里的其他解决方案,但他们的解决方案对我没有帮助。
void init()
{
...
sem_unlink(sem_name.c_str());
if (parent_process)
{
sem_t* semaphore = sem_open(sem_name.c_str(), O_CREAT | O_RDWR, 0);
if (SEM_FAILED == semaphore)
{
display_error();
}
sem_close(semaphore);
}
child_pid = fork();
if (child_pid == -1)
{
display_error();
}
else if (child_pid == 0)
{
int ret = execve(program_name, args, env);
if (ret == -1)
{
display_error();
}
}
else
{
// rest of code
}
...
}
我让子进程等待在另一个具有此功能的类中释放:
void wait_until_released()
{
if (!parent_process)
{
sem_t* semaphore = sem_open(sem_name.c_str(), O_CREAT | O_RDWR, 0);
if (SEM_FAILED == semaphore)
{
display_error();
}
sem_wait(semaphore);
sem_close(semaphore);
sem_unlink(semaphore);
}
}
帖子是在代码中的另一个位置完成的:
void release_child()
{
sem_t* semaphore = sem_open(sem_name.c_str(), O_CREAT | O_RDWR, 0);
if (SEM_FAILED == semaphore)
{
display_error();
}
if (sem_post(semaphore) != 0)
{
display_error();
}
sem_close(semaphore);
sem_unlink(semaphore);
}
【问题讨论】:
标签: c++ posix semaphore unlink