9

C の Linux ベースのシステムでセマフォを動作させるのに多くの困難を経験しています。

私の申請プロセスは次のとおりです。

  1. 申し込み開始
  2. アプリケーションは子/親に分岐します
  3. 各プロセスはsem_open共通名を使用してセマフォを開きます。

フォークする前にセマフォを作成すると、正常に動作します。ただし、要件により、そうすることができません。2 回目の呼び出しを試みるとsem_open、「許可が拒否されました」というエラーが表示されます (経由errno)。

何らかの方法でこれを行うことは可能ですか? または、1 つのプロセスでセマフォを開き、共有メモリ メカニズムを使用して子プロセスと共有する方法はありますか?

4

2 に答える 2

10

フラグで O_CREAT を使用する場合は、モードと値のパラメーターを指定することを忘れないでください。これが実際の例です:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/wait.h>

static void parent(void)
{
    sem_t * sem_id;
    sem_id=sem_open("mysem", O_CREAT, 0600, 0);
    if(sem_id == SEM_FAILED) {
        perror("parent sem_open");
        return;
    }
    printf("waiting for child\n");
    if(sem_wait(sem_id) < 0) {
        perror("sem_wait");
    }
}

static void child(void)
{
    sem_t * sem_id;
    sem_id=sem_open("mysem", O_CREAT, 0600, 0);
    if(sem_id == SEM_FAILED) {
        perror("child sem_open");
        return;
    }
    printf("Posting for parent\n");
    if(sem_post(sem_id) < 0) {
        perror("sem_post");
    }
}

int main(int argc, char *argv[])
{
    pid_t pid;
    pid=fork();
    if(pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if(!pid) {
        child();    
    } else {
        int status;
        parent();
        wait(&status);
    }
    return 0;
}
于 2010-02-19T14:45:09.647 に答える
8

sem_open の 4 パラメータ バージョンまたは 2 パラメータ バージョンを使用していますか?

必ず 4 パラメータ バージョンを使用し、他のプロセスがセマフォを開くことができるモードを使用してください。すべてのプロセスが同じユーザーによって所有されていると仮定すると、モード 0600 ( S_IRUSR | S_IWUSR) で十分です。

また、umask が必要なパーミッションをマスクしていないことを確認することもできます。

于 2010-02-19T07:34:56.783 に答える