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. my_new_write()

  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を使用してセマフォを初期化し、2番目の引数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で

于 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 に答える