|
|
|
|
 Interrupted system call - twmt_linuxforum [ 2005-04-27 21:35 | 1,065 byte(s)]
 Re: Interrupted system call - twmt_linuxforum [ 2005-04-29 14:22 | 727 byte(s)]
 Re: Interrupted system call - drangon_zhou [ 2005-04-29 15:36 | 379 byte(s)]
 Re: Interrupted system call - hoyt [ 2005-04-28 09:05 | 90 byte(s)]
 Re: Interrupted system call - twmt_linuxforum [ 2005-04-28 10:02 | 125 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
请帮我看看这段代码是什么问题。谢谢!
想实现的功能是:
创建的线程运行后,首先查询消息队列中是否有消息,如果有的话,则用alarm闹钟设置一个时间值,由catch_alarm来捕捉该信号。
运行的时候产生了Interrupted system call 错误提示。
看起来好像是因为alarm已经运行了,所以再运行msgrcv就产生如此错误?不解,请指点。谢谢了!
部分代码如下:
void catch_alarm(int sig_num)
{
printf("time out! I will exit
");
alarm(0);
}
//创建的进程
void *mypthread(void)
{
....
while(1){
rc = msgrcv(queue_id, recv_msg, 110, 0, 0); //读取消息 《-------这里产生错误的!
if (rc == -1){
perror("main:msgrcv");
exit(1);
}
signal(SIGALRM, catch_alarm);
alarm(atoi(recv_msg->mtext));
...
}
}
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
新问题了:程序发生中断系统调用后,我使得msgrcv重新启动。但是我发送了消息后,该线程并没有继续执行下面的内容。
看起来好像没有接收到消息啊???为什么呢?
......
while(1){
again:
//读取消息
rc = msgrcv(queue_id, recv_msg, 110, 0, 0);
if(errno ==EINTR) goto again;
if (queue_id == -1){
perror("pthreadTest: msgget");
exit(1);
}
signal(SIGALRM, catch_alarm);
alarm(atoi(recv_msg->mtext));
printf("I receive a message: %s
So I will draw a map!
", recv_msg->mtext);
......
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
again:
//读取消息
rc = msgrcv(queue_id, recv_msg, 110, 0, 0);
if(errno ==EINTR) goto again;
~~~~~~~~~~~~~~~~~~~不能只判断errno,要先判断rc是否为-1,
当rc不为-1时,errno的值不变(为上次的值,不会自动清0!!!!)
if (queue_id == -1){
perror("pthreadTest: msgget");
exit(1);
}
|
|
|
----
岂有豪情似旧时,花开花落两由之。
|
|
[Original]
[Print]
[Top]
|
|
|