如何检查c中信号量的状态?

时间:2012-07-19 11:16:18

标签: c ipc pipe semaphore shared-memory

我有一个全局静态变量,它是一个信号量,因为我正在编写一个库,而不是一个程序。

在使用该库的main()程序中,调用了fork(),并且读取&基于共享内存写入管道或从管道写入。

例如,这是使用我的库的main()

#include <stdio.h>
#include <stdlib.h>
#include "my_pipe_shared_memory_based.h"
int main()

{
    int spd, pid, rb;
    char buff[4096];
    my_new_init();

    if (my_new_fifo("tmp_shm_pipe",0666) < 0)
    {
        perror("my_new_fifo");
        exit(1);
    }

    if (fork()) 
    {
        spd = my_new_open("tmp_shm_pipe", O_RDONLY, 0600);
        if (spd < 0)
        {
            perror("PARENT: my_new_open");
            exit(1);
        }
        rb = my_new_read(spd, buff, sizeof(buff));
        if (rb > 0)
            write(1, buff, rb);
    }

    else
    {
        spd = my_new_open("tmp_shm_pipe", O_WRONLY, 0600);
        if (spd < 0)
        {
            perror("SON: my_new_open");
            exit(1);
        }
        my_new_write(spd, "hello world!\n", sizeof("hello world!\n"));
    }

    my_new_close(spd);
    my_new_un_link("tmp_shm_pipe");
    my_new_finish();

    return 0;
}

现在,我想在每次进程阅读和/或编写之前使用信号量:

  1. my_new_write()

  2. my_new_read()

  3. 现在,问题是,我如何在上面请求的方法中检查信号量的状态(例如my_new_write&amp; my_new_read),这样我就可以让这个过程完成他的事情,如果另一个进程正在读/写,则阻止它?

    谢谢

2 个答案:

答案 0 :(得分:2)

这里的关键是你必须确保两个进程都能看到确保互斥的信号量。为此,您需要分配共享内存并在分叉之前初始化信号量。对于此任务,您可以使用例如mmap。示例(没有任何错误检查):

sem_t *sem = mmap(NULL, sizeof(sem_t),
                  PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);

在此之后,使用sem_init初始化信号量并确保第二个参数pshared为非零值。手册说:

  

如果pshared为非零,则信号量在进程之间共享,并且应位于共享内存的区域中(请参阅shm_open(3),mmap(2)和shmget(2))。 (由于fork(2)创建的子进程继承了父进程的内存映射,因此它也可以访问信号量。)任何可以访问共享内存区域的进程都可以使用sem_post(3),sem_wait(3)等对信号量进行操作。

最后,分叉进程并正常使用sem_wait和sem_post。

编辑:

真的,尝试替换它:

mySemaphore = sem_open("mySemaphore", O_CREAT, S_IRUSR | S_IWUSR);

有了这个:

mySemaphore = mmap(NULL, sizeof(sem_t),
                   PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
sem_init(mySemaphore, 1, 1);

在函数my_new_open

答案 1 :(得分:1)

sem_trywait()和sem_wait()不是你要找的东西吗?用信号量句柄调用它们,你就会知道它们的状态。

http://pubs.opengroup.org/onlinepubs/7908799/xsh/sem_trywait.html

不确定信号量,但带有互斥锁的pthread_cond_timedwait()也可以让您检查同步状态而不会阻塞线程(或给出超时)。