2012-12-07 77 views
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()

012獲得總線錯誤
BeforeSemWait 

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

我在做什麼錯?

編輯:全部代碼: master.c:http://pastebin.com/3MnMjUUM worker.c http://pastebin.com/rW5qYFqg

+1

怎麼樣'semaphore'和'count_sem'聲明/定義?它們應該是'sem_t * semaphore;',等等......此外,由於除了EINTR之外的原因,sem_wait()可以返回-1,你可能想要檢查那些... – twalberg

+0

是你唯一的調用到'sem_wait()'?你可以在while();'循環中printf()'一些東西來知道信號是否在第一次迭代中發送? –

+0

這是在第一次迭代中,我原本在那裏有一個打印語句,是的,這是唯一的調用sem_wait() – fotg

回答

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

+0

錯誤不是別的地方,我編輯了上面的問題,以反映我如何確定這 – fotg

+0

也,我嘗試了你的代碼,並且得到了 '編程接收到的信號SIGBUS,總線錯誤。' '0x00a20915在sem_post @@ GLIBC_2.1()from/lib/libpthread.so.0' – fotg

+0

在這裏加入''-lpthread ''到''gcc''行 –