1

セマフォを使用して小さな割り当てを行っています。プログラムが終了したらセマフォを破棄したいのですが、それを試みるたびに「引数が無効です」というエラーが表示されます。動作するいくつかの例に従いましたが、私が何をしているのかわかりません。これが私のコードです:

#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

誰が理由を教えてくれますか?!

ありがとう!

ライナス

4

1 に答える 1

2

It's because you are destroying it in both threads. The second attempt fails. Put that statement inside the if block after the wait.

于 2012-09-17T16:12:07.657 に答える