在两个进程之间共享信号量数组| 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
    }