信号量相当于进程?

时间:2011-07-12 05:20:37

标签: c linux process synchronization

我有一个父进程,分叉两个孩子。我需要在这些子进程运行时强制执行某个命令。

例如,父进程从文件中获取“命令”,并且根据该命令,父进程将使用未命名的管道将该命令传递给子a或子b。我需要在子节点中发生的事情与父节点从文件中接收命令的顺序相同。

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

2 个答案:

答案 0 :(得分:6)

信号量在进程之间工作正常。例如:

#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 :(得分:1)

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