【问题标题】:semaphore equivalent for processes?进程的信号量等价物?
【发布时间】:2011-07-12 05:20:37
【问题描述】:

我有一个分叉两个孩子的父进程。我需要强制这些子进程运行的特定顺序。

例如,父进程从文件中获取“命令”,根据该命令,父进程将使用未命名的管道将该命令传递给子 a 或子 b。我需要按照父级从文件中接收命令的顺序在子级中发生一些事情。

我使用信号量的方式在进程之间不起作用。有什么想法吗?

【问题讨论】:

  • 缺少一点问题,就在“相同顺序”附近。
  • 如果你问如何阻止一个孩子直到它完成,只需使用第二个未命名的管道(父母可以阻止读取,直到孩子写入它 - 没关系写)。
  • 查看Logical Clocks ?
  • @Ignacio:不知道你在说什么。我可以看到整个问题。
  • @chris:这是个好主意。谢谢。

标签: c linux process synchronization


【解决方案1】:

信号量在进程之间工作得很好。例如:

#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>

int main(void)
{
  // Error checking omitted for expository purposes
  sem_t *sem = sem_open("test_semaphore", O_CREAT|O_EXCL, 0, 1);
  sem_unlink("test_semaphore");
  int child = fork();
  printf("pid %d about to wait\n", getpid());
  sem_wait(sem);
  printf("pid %d done waiting\n", getpid());
  sleep(1);
  printf("pid %d done sleeping\n", getpid());
  sem_post(sem);

  if(child > 0)
  {
    int status;
    printf("parent done, waiting for child\n");
    wait(&status);
  }

  printf("pid %d exiting\n", getpid());
  return 0;
}

输出:

$ time ./a.out
pid 61414 about to wait
pid 61414 done waiting
pid 61415 about to wait
pid 61414 done sleeping
parent done, waiting for child
pid 61415 done waiting
pid 61415 done sleeping
pid 61415 exiting
pid 61414 exiting

real    0m2.005s
user    0m0.001s
sys 0m0.003s

【讨论】:

  • +1。但我认为你可以通过在sem_open 之后立即调用sem_unlink 来使这个更干净一些。信号量将继续存在,直到所有对它的引用都关闭,例如通过退出的进程。立即取消链接的好处是,如果父级崩溃,您不会留下永远不会消失的杂散信号量。
  • sem_open 调用中的 0644 参数是什么意思?
  • @Nemo:好点,更新了。 @ladookie:它设置权限(如信号量上的chmod(2),以防其他进程决定要使用sem_open 打开相同的信号量。请参阅man page
  • @Adam Rosenfield:你编辑时 fork() 被砍掉了。
  • 不是每个进程都有自己的地址空间吗?这不会让进程 1 和进程 2 拥有自己的私有信号量变量吗?请澄清,因为我正在寻找解决类似问题。
【解决方案2】:

如果您使用 IPC 信号量,它们也适用于分叉。看这里:http://www.advancedlinuxprogramming.com/alp-folder 第 5 章将为您提供所需的信息。

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 2012-02-03
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多