BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #27640同步于 2009/8/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]关于sem_wait

myou
2009/8/27镜像同步3 回复
问题环境:pthread编程,使用信号量同步,发现程序运行一天左右总是core dump,经过调试发现是信号量的问题。 描述:sem_wait()偶尔会没有阻塞。 后来发现程序其他地方的信号机制会影响到信号量的使用,后来写了一小段测试代码 贴测试代码: static sem_t mysem; static void sig_usr(int signo) { if (signo == SIGALRM) printf("recvied SIGALRM\n"); } int main(void) { struct sigaction tact; sigset_t mask, oldmask; sigemptyset(&mask); sigaddset(&mask, SIGALRM); sigprocmask(SIG_BLOCK, &mask, &oldmask); tact.sa_handler = &sig_usr; tact.sa_flags = 0; tact.sa_mask = mask; sigaction(SIGALRM, &tact, NULL); sigprocmask(SIG_SETMASK, &oldmask, NULL); sem_init(&mysem, 0, 0); for(;;){ sem_wait(&mysem); printf("After wait, mysem value %ld \n", mysem.__align); sem_wait(&mysem); } } 用kill -SIGALRM (pid)把信号传给程序的时候,居然可以打印出来信息,百发百中……不解 希望对信号或者信号量熟悉的童鞋给一些了解此问题的建议 谢谢啦
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
hman机器人#1 · 2009/8/30
那你这段代码是会出现什么问题?
myou机器人#2 · 2009/8/30
基本知道为什么了,sem_wait是可以被信号中断的。 只是在多线程里面比较详细的信号机制还在研究中…… 【 在 hman 的大作中提到: 】 : 那你这段代码是会出现什么问题?
hman机器人#3 · 2009/8/30
哦 不懂。 那crash呢?