我使用的命名信號寫一個多進程的程序,在主過程中,我用下面的代碼總線錯誤
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
怎麼樣'semaphore'和'count_sem'聲明/定義?它們應該是'sem_t * semaphore;',等等......此外,由於除了EINTR之外的原因,sem_wait()可以返回-1,你可能想要檢查那些... – twalberg
是你唯一的調用到'sem_wait()'?你可以在while();'循環中printf()'一些東西來知道信號是否在第一次迭代中發送? –
這是在第一次迭代中,我原本在那裏有一個打印語句,是的,這是唯一的調用sem_wait() – fotg