2016-12-30 4 views
0

あなたがセマフォSystem Vのドキュメント(http://man7.org/linux/man-pages/man2/semop.2.html)で見ることができるように次のことを述べている部分があります:セマフォSystem Vの - のsemop実装

次のコードセグメントは、(のsemopを使用しています)セマフォー0の の値がゼロになるまでアトミックに待ってから、セマフォー の値を1増分します。

 struct sembuf sops[2]; 
     int semid; 

     /* Code to set semid omitted */ 

     sops[0].sem_num = 0;  /* Operate on semaphore 0 */ 
     sops[0].sem_op = 0;   /* Wait for value to equal 0 */ 
     sops[0].sem_flg = 0; 

     sops[1].sem_num = 0;  /* Operate on semaphore 0 */ 
     sops[1].sem_op = 1;   /* Increment value by one */ 
     sops[1].sem_flg = 0; 

     if (semop(semid, sops, 2) == -1) { 
      perror("semop"); 
      exit(EXIT_FAILURE); 
     } 

この例の後、私はいくつかの質問があります:

1- (semop(semid, sops, 2) == -1)は2点のSOPの位置を実行していますか? sops [0]とsops [1]?

2なぜそうですsops[0].sem_op = 0; semidの値が0になるのを待ちますか?

答えて

1

1-(semop(semid、sops、2)== -1)は2つのsops位置を実行しますか? sops [0]とsops [1]?

これを実行しようとします。これはsemop()関数を実行し、値を返すために実行する必要があります(サンプルコードは-1に対してテストします)。多くのC関数と同様に、semop()は失敗すると-1を返します。その場合、その機能では、どちらの操作も実行されていないことに依存することができます。そうでない場合、semop()は0を返します。その場合、実行された両方の操作に依存することができます。

2-もしそうなら、なぜsops [0] .sem_op = 0; semidの値が0になるのを待ちますか?

これは、sem_opの値が意味するように定義されているためです。あなた自身がリンクされドキュメントがそれを置くよう:

sem_opがゼロの場合、プロセスは セマフォ集合に読み込み許可を持たなければなりません。これは「ゼロ待機」操作です。[...]

関連する問題