在两个进程之间共享信号量数组| linux C
各位,我在这里问你们我如何在两个进程之间共享一个信号量数组??因为我用在两个进程之间共享信号量数组| linux C,c,linux,posix,shared-memory,semaphore,C,Linux,Posix,Shared Memory,Semaphore,各位,我在这里问你们我如何在两个进程之间共享一个信号量数组??因为我用semget(…)创建了一个数组,但我不能在上面使用shmat(…) 对于共享内存段,我通常先使用shmget(),然后使用shmat(…),以便子进程可以访问它。 但是它是如何与信号量数组一起工作的呢 我找不到任何类似的方法可以附加() 在这里,我使用semget()创建一个包含5个信号量的数组: /* allocate semaphores */ if ((semid = semget(IPC_PRIVATE,5,
semget(…)
创建了一个数组,但我不能在上面使用shmat(…)
对于共享内存段,我通常先使用shmget()
,然后使用shmat(…)
,以便子进程可以访问它。
但是它是如何与信号量数组一起工作的呢
我找不到任何类似的方法可以附加()
在这里,我使用semget()
创建一个包含5个信号量的数组:
/* 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);
在另一个过程中,我尝试在使用该数组之前附加它(但我使用的是shmat,似乎不起作用……)
linux上有两种可用的信号量:sysV和POSIX。您正在使用sysV信号量 sysV信号量是在内核中维护的,因此您不需要为它们分配空间或将它们放在共享内存中来共享它们。但您确实需要为每个使用它们的进程找到它们的方法。执行此操作的机制是
键
类型
函数ftok
获取路径名和id,并返回一个键。这允许指定正确路径和id的每个进程生成相同的密钥
semget
获取生成的键、请求的信号量数量和一些权限标志,并返回信号量标识符,即semid
。semid用于对semctl
和semop
的所有后续调用
另一种选择是,当您不需要与其他进程共享信号量的标识时,使用IPC\u PRIVATE调用semget
,而不是生成的key\t
。通过使用IPC_PRIVATE,您隐式地确认没有不相关的进程需要知道返回的semid
,从而访问信号量。这对于具有共享内存的多线程的单个进程非常有用,因此semid
;或用于在分叉之前创建信号量但在分叉之后共享semid副本的相关进程
所以您的问题似乎是您有两个不相关的进程需要共享一些信号量。为此,您需要使用ftok
机制生成密钥,以便所有相关人员都能找到它们。linux上有两种可用的信号量:sysV和POSIX。您正在使用sysV信号量
sysV信号量是在内核中维护的,因此您不需要为它们分配空间或将它们放在共享内存中来共享它们。但您确实需要为每个使用它们的进程找到它们的方法。执行此操作的机制是键
类型
函数ftok
获取路径名和id,并返回一个键。这允许指定正确路径和id的每个进程生成相同的密钥
semget
获取生成的键、请求的信号量数量和一些权限标志,并返回信号量标识符,即semid
。semid用于对semctl
和semop
的所有后续调用
另一种选择是,当您不需要与其他进程共享信号量的标识时,使用IPC\u PRIVATE调用semget
,而不是生成的key\t
。通过使用IPC_PRIVATE,您隐式地确认没有不相关的进程需要知道返回的semid
,从而访问信号量。这对于具有共享内存的多线程的单个进程非常有用,因此semid
;或用于在分叉之前创建信号量但在分叉之后共享semid副本的相关进程
所以您的问题似乎是您有两个不相关的进程需要共享一些信号量。为此,您需要使用ftok
机制生成密钥,以便所有相关人员都能找到它们。您根本不需要共享内存。只是不要在这两个过程中使用IPC\u PRIVATE
,而是使用ftok
返回的真实密钥。请参阅,例如,您根本不需要共享内存。只是不要在这两个过程中使用IPC\u PRIVATE
,而是使用ftok
返回的真实密钥。请参阅,例如,如果我想使用IPc Private并尝试使用Id对数组直接执行某些操作,会发生什么情况?它能用还是我必须用ftok?为什么?我收回我以前的评论。我不这么认为。第二个进程仍然需要调用semget
来建立权限,因此,即使您可以传递semid
,如果它试图使用semop
或semctl
,它也会因EACCES而失败。如果它用IPC_PRIVATE调用semget
本身,它只会得到一个不同的semid
,而不会共享现有的信号量。如果我想使用IPC PRIVATE,并尝试使用Id对数组直接执行一些操作,会发生什么?它能用还是我必须用ftok?为什么?我收回我以前的评论。我不这么认为。第二个进程仍然需要调用semget
来建立权限,因此,即使您可以传递semid
,如果它试图使用semop
或semctl
,它也会因EACCES而失败。如果它用IPC_PRIVATE调用semget
本身,它只会得到一个不同的semid
,而不会共享现有的信号量。
sem_t* addr1;
if((addr1=(sem_t*)shmat(semid,NULL,0))==-1){
printf("shmat() fallita sem id\n");
perror("shmat() for content");
exit(-1);// +1 per \0 finale
}