【问题标题】:Share array of Semaphores between two processes | linux C在两个进程之间共享信号量数组 | linux C
【发布时间】:2013-12-21 19:15:42
【问题描述】:

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

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

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

这里我使用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,似乎无法正常工作..)

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
    }

【问题讨论】:

  • 你根本不需要共享内存。只是不要使用IPC_PRIVATE,而是在两个进程中使用ftok 返回的真实密钥。参见例如here.

标签: c linux posix shared-memory semaphore


【解决方案1】:

在 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 之前创建信号量但在 fork 之后共享 semid 副本的相关进程。

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

【讨论】:

  • 如果我想使用 IPc-Private 并且我尝试使用 Id 对阵列直接执行一些操作会发生什么?它有效还是我必须使用 ftok?为什么?
  • 我收回我之前的评论。我不这么认为。第二个进程仍然必须调用semget 来建立权限,因此即使您可以将semid 传递给它,如果它尝试使用semopsemctl,它也会因EACCES 而失败。如果它使用 IPC_PRIVATE 调用 semget 本身,它只会得到一个不同的 semid 并且不会共享现有的信号量。
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2020-02-17
  • 2020-09-06
  • 2012-01-11
相关资源
最近更新 更多