0

プロセス A にセマフォを設定しました (semget + init to 1)。A をフォークして、B を取得しました。

B をフォークして C を取得しました (プロセス B、C のコードは別の .c ファイルにあるため、extern int semid を使用してグローバル整数として semid を渡しています)。

プロセス C コードに down(semid) を適用しようとすると、「無効な引数」エラーが発生します。
down 関数のコードで行っていることは次のとおりです。

struct sembuf sem_d;
sem_d.sem_num = 0;
sem_d.sem_op = -1;
sem_d.sem_flg = 0;
if ( semop(semid, &sem_d, 1) == -1 )
{
    perror("error with down function");
    return -1;
}

私は何を間違っていますか?

また、セマフォが初期化されたときの semid が semop の前と同じであることを確認しました。
また、プロセスAでは、BIはwait(-1)を使用しています。

4

1 に答える 1

0

フォーク上での使用が許可されているかどうかはわかりませんsemget()。結局のところ、それは別のプロセス空間です。

semget()とにかく古いSystem Vセマフォの一部です。

POSIX セマフォ-sem_open()sem_wait()フレンズに切り替えて、名前付きセマフォを使用することをお勧めします。次に、各プロセスで同じセマフォ名を開きます。

于 2012-12-04T14:21:25.223 に答える