0

私のプログラムは次のように動作するはずだと思いました:1)名前のないセマフォを値= 0で初期化しますsem_init(..)の2番目の値は1であるため、MANでセマフォはプロセス間で共有されると言われています2)子を作成し、子はセマフォまで待機します値が1になる

親プロセスはセマフォの値を増やすため、子はすぐに終了する必要がありますが、実際には終了しないため、それが問題です

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>


pid_t child;


void child_proc(sem_t* sem) {
    sem_wait(sem);
    printf("OK\n");
}

void parent_proc(sem_t* sem) {

    sem_post(sem);
    sleep(2);

    int status;
    waitpid(child, &status, 0);
}

int main(int argc, char* argv[]) {
    sem_t sem;
    sem_init(&sem, 1, 0);

    child = fork();

    if (0 == child) {
        child_proc(&sem);
        return 0;
    }

    parent_proc(&sem);
    return 0;
}
4

1 に答える 1

1

問題は、両方のプロセスがセマフォ構造のローカル (共有ではない) コピーを持ち、一方のプロセスでの変更が他方のプロセスに反映されないことです。

マニュアル ページにも記載されているように、プロセス間でセマフォを共有する場合は、の 2 番目の引数にゼロ以外の値を渡す必要があるだけsem_initでなく、sem_t構造体も共有メモリの領域に存在する必要があります。サンプル プログラムでは、共有されていないスタック上に存在します。

mmap共通のファイル マッピング ( with ) または with を使用してshm_open、特にメモリを共有できます。

于 2013-04-16T17:47:01.590 に答える