URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 34 » Interrupted system call
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
Interrupted system call
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)]
 
Subject: Interrupted system call
Author: twmt_linuxforum    Posted: 2005-04-27 21:35    Length: 1,065 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]
Subject: Re: Interrupted system call
Author: hoyt    Posted: 2005-04-28 09:05    Length: 90 byte(s)
[Original] [Print] [Top]
好像你的信号不是被你新创建的线程所捕获
你专门设置一个线程来捕获信号看看
----
欢迎访问我的个人网站 www.linuxc.net
[Original] [Print] [Top]
Subject: Re: Interrupted system call
Author: twmt_linuxforum    Posted: 2005-04-28 10:02    Length: 125 byte(s)
[Original] [Print] [Top]
问题解决了,参考APUE的解决方法

again:
......
if (errno ==EINTR)
goto again;
[Original] [Print] [Top]
Subject: Re: Interrupted system call
Author: twmt_linuxforum    Posted: 2005-04-29 14:22    Length: 727 byte(s)
[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]
Subject: Re: Interrupted system call
Author: drangon_zhou    Posted: 2005-04-29 15:36    Length: 379 byte(s)
[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]
« Previous thread
gcc 图形配置
C/C++编程版
34
Next thread »
redhat下获取所有进程列表?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:59, cost 0.04838490486145 ms.