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



大家好,我在这里问你们如何在两个进程之间共享信号量数组?因为我用semget(..)创建了一个数组,但我不能在上面使用shmat(..)

对于共享内存段,我通常先使用shmget(),然后使用shmat(..),这样子进程就可以访问它。但是它是如何处理一系列信号量的呢?

我找不到任何类似的方法可以attach()!!!

在这里,我使用semget()创建一个由5个信号量组成的数组:

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

在另一个过程中,我试图在使用这个数组之前附加它(但我使用的是shmat,似乎不起作用。)

sem_t* addr1;
if((addr1=(sem_t*)shmat(semid,NULL,0))==-1){
printf("shmat() fallita sem idn");
perror("shmat() for content");
exit(-1);// +1 per  finale
}

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的多个线程的单个进程是有用的;或者用于在分叉之前创建信号量但在分叉之后共享semid副本的相关进程。

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

最新更新