2016-12-30 23 views
0

,你可以在信号系统V文档(http://man7.org/linux/man-pages/man2/semop.2.html)有指出以下部分中看到:信号灯系统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个小恩小惠位置? sops [0]和sops [1]?

2-如果是这样,为什么sops[0].sem_op = 0;等待semid的值等于0?

回答

1

1-是否(se​​mop(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为零,进程必须具有读取的 信号灯设置权限。这是一个“等待零”操作[...]