每个人,我在这里问你我如何在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);
答案 0 :(得分:4)
Linux上有两种信号量:sysV和POSIX。您正在使用sysV信号量。
sysV信号量在内核中维护,因此您不需要为它们分配空间或将它们放在共享内存中以共享它们。但是你确实需要一种方法来使用它们来找到它们。执行此操作的机制是key_t
类型。
函数ftok
获取路径名和ID并返回key_t
。这允许指定正确路径和id的每个进程生成相同的key_t
。
semget
获取生成的key_t
,请求的信号量数量和一些权限标志,并返回信号量标识符,即semid
。 semid用于后续调用semctl
和semop
。
另一种方法是,当您不需要共享信号量与其他进程的身份时,使用IPC_PRIVATE而不是生成的semget
来调用key_t
。您通过使用IPC_PRIVATE隐式确认没有不相关的进程需要知道返回的semid
,从而访问信号量。这对于具有共享内存的多个线程的单个进程非常有用,因此semid
;或者在分叉之前创建信号量的相关进程,但是在fork之后共享semid的副本。
所以你的问题似乎是你有两个不相关的进程需要共享一些信号量。为此,您需要使用ftok
机制生成密钥,以便所有相关人员都能找到它们。