0

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

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. 我的新写()

  2. my_new_read()

my_new_write现在,问题是,我怎样才能在上面请求的方法(例如& )中每次检查信号量的状态my_new_read,所以我可以让进程做他的事情,或者阻止它,如果另一个进程当前正在读/写?

谢谢

4

2 回答 2

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) 等对信号量进行操作.

最后fork进程,正常使用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

于 2012-07-19T12:50:46.210 回答
1

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

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

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

于 2012-07-19T12:21:25.500 回答