1

名前付きセマフォを使用してマルチプロセス プログラムを作成しています。マスター プロセスでは、次のコードでセマフォを開いています。

semaphore = sem_open("/msema",O_RDWR|O_CREAT|O_TRUNC,00777,1);      
if (semaphore == SEM_FAILED)
    perror("SEMAPHORE");

そして子プログラムで

count_sem=sem_open("/msema",O_RDWR);
if(count_sem==SEM_FAILED) 
 {
 perror("sem_open");
 return 1;
 }

sem_wait() で

   do {
   errno=0;  
printf("BeforeSemWait\n");  
    rtn=sem_wait(count_sem);
printf("afterSemWait\n");
  } while(errno==EINTR);
  if(rtn < 0) {
  printf("Error\n");
  perror("sem_wait()");
  sem_close(count_sem);
  return 1;
 }

sem_wait() からバス エラーが発生しています

 BeforeSemWait

 Program received signal SIGBUS, Bus error.
 0x00a206c9 in sem_wait@@GLIBC_2.1 () from /lib/libpthread.so.0`

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

編集: コード全体: master.c: http://pastebin.com/3MnMjUUM worker.c http://pastebin.com/rW5qYFqg

4

1 に答える 1

0

プログラムのどこかにバグがあるはずです。以下はここで動作します (O_TRUNC は必要ありません):
semproducer.c:

#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>
int main () {
  sem_t *sem=sem_open("/msema",O_RDWR|O_CREAT /* |O_TRUNC*/ ,00777,1);
  if (sem==SEM_FAILED) {
    perror("sem_open");
  }
  else {
    while (1) {
      sem_post (sem);
      printf ("sem_post done\n");
      sleep (5);
    }
  }
}

semconsumer.c:

#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>
#include <errno.h>
int main () {
  sem_t *count_sem=sem_open("/msema",O_RDWR);
  if(count_sem==SEM_FAILED) {
    perror("sem_open");
    return 1;
  }
  do {
    int rtn;
    do {
      errno=0;
      rtn=sem_wait(count_sem);
    } while(errno==EINTR);
    if(rtn < 0) {
      perror("sem_wait()");
      sem_close(count_sem);
      return 1;
    }
    printf ("sema signalled\n");
  } while (1);
}

でコンパイルしgcc semproducer.c -o semproducer -lrtgcc semconsumer.c -o semconsumer -lrt

于 2012-12-08T05:29:00.347 に答える