在两个进程之间共享信号量数组| linux C

时间:2013-12-21 19:15:43

标签: c linux posix shared-memory semaphore

每个人,我在这里问你我如何在2个进程之间共享一组信号量??因为我用semget(..)创建了一个数组但是我不能使用{ {1}}就可以了!

对于共享内存段,我通常首先使用shmat(..),然后使用shmget(),以便子进程可以访问它。 但它如何与一组信号量一起工作?

我找不到任何类似的方法能够附上()!!!

这里我使用shmat(..)创建一个包含5个信号量的数组:

semget()

在另一个过程中,我尝试在使用之前附加此数组(但我使用shmat并且似乎无法正常工作..)

/* allocate semaphores */
    if ((semid = semget(IPC_PRIVATE,5,IPC_CREAT|0666)) == -1) {
        printf("shmget() fallita sem id\n");
        perror("semget()");
        //releaseAll(bufferid,Tid,Did,semid);
        exit(-4);

1 个答案:

答案 0 :(得分:4)

Linux上有两种信号量:sysV和POSIX。您正在使用sysV信号量。

sysV信号量在内核中维护,因此您不需要为它们分配空间或将它们放在共享内存中以共享它们。但是你确实需要一种方法来使用它们来找到它们。执行此操作的机制是key_t类型。

函数ftok获取路径名和ID并返回key_t。这允许指定正确路径和id的每个进程生成相同的key_t

semget获取生成的key_t,请求的信号量数量和一些权限标志,并返回信号量标识符,即semid。 semid用于后续调用semctlsemop

另一种方法是,当您不需要共享信号量与其他进程的身份时,使用IPC_PRIVATE而不是生成的semget来调用key_t。您通过使用IPC_PRIVATE隐式确认没有不相关的进程需要知道返回的semid,从而访问信号量。这对于具有共享内存的多个线程的单个进程非常有用,因此semid;或者在分叉之前创建信号量的相关进程,但是在fork之后共享semid的副本。

所以你的问题似乎是你有两个不相关的进程需要共享一些信号量。为此,您需要使用ftok机制生成密钥,以便所有相关人员都能找到它们。