如何在Linux上销毁C中的信号量时防止错误?

时间:2012-09-17 16:00:09

标签: c linux semaphore

我正在使用信号量进行小型任务。我想在程序完成后销毁信号量,但每次尝试它都会给我一个错误:“无效的参数”。 我已经关注了几个可行的例子,但我看不出我在做什么不同。 这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

void display(char *str) {
  char *tmp;
  for (tmp=str;*tmp;tmp++) {
    write(1,tmp,1);
    usleep(100);
  }
}

int main() {
  struct sembuf up = {0,1,0};
  struct sembuf down = {0,-1,0};
  int i, my_sem;

  my_sem = semget(IPC_PRIVATE, 1, 0600); /*create semaphore*/
  if(my_sem<0){
    perror("Error getting semaphore:");
  }

  if(semop(my_sem, &up, 1)){perror("error changing semaphore:");}; /*set to 1*/

  if (fork()) {
    for (i=0;i<10;i++) {
      if(semop(my_sem, &down, 1)){perror("error changing semaphore:");}; 
      display("Hello world\n");
      if(semop(my_sem, &up, 1)){perror("error changing semaphore:");}; 
    }
    wait(NULL);
  }
  else {
    for (i=0;i<10;i++) {
      if(semop(my_sem, &down, 1)){perror("error changing semaphore:");};
      display("Bonjour monde\n");
      if(semop(my_sem, &up, 1)){perror("error changing semaphore:");}; 
    }
  }

  if(semctl(my_sem,0,IPC_RMID)){perror("error destroying semaphore:");}  /*destroy the semaphore*/

  return 0;
}

这导致以下输出:

Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
Hello world
Bonjour monde
error destroying semaphore:: Invalid argument

谁能告诉我为什么?!

谢谢!

莱纳斯

1 个答案:

答案 0 :(得分:2)

这是因为你在两个线程中都在摧毁它。第二次尝试失败了。将该语句放在if之后的wait块中。