当前位置:  技术问答>linux和unix

疑惑求助:unix线程执行被异步中断后的问题

    来源: 互联网  发布时间:2016-03-24

    本文导语:  我下了个ping功能的源代码,是《《unix网络编程第一卷:套接口API>>上的,程序分为两大部分,一是在一个原始套接口上读入收到的每个分组,显示icmp回射应答,另一个是每隔五秒发送一个icmp回射请求,由SIGALRM信号...

我下了个ping功能的源代码,是《《unix网络编程第一卷:套接口API>>上的,程序分为两大部分,一是在一个原始套接口上读入收到的每个分组,显示icmp回射应答,另一个是每隔五秒发送一个icmp回射请求,由SIGALRM信号每五秒驱动一次。
单独编译成一个独立的可执行文件能正常运行。当我将此源代码用线程的形式在一个子线程中执行时,达不到预期的结果。


出问题的关键的代码如下:
           sig_alrm(SIGALRM); /* 直接调用用信号处理函数发送第一个数据包,以后定时器时间到信号处理函数每隔五秒发送一次icmp回射请求 */
for ( ; ; ) {
msg.msg_namelen = pr->salen;
msg.msg_controllen = sizeof(controlbuf);
n = recvmsg(sockfd, &msg, 0);//   
if (n fproc)(recvbuf, n, &msg, &tval);
}
}
单独编译成一个可执行程序时,上述代码工作的很好:当信号处理函数每五秒异步发生时,recvmsg 被中断,返回-1 给n,并正确的置errno为EINTR ,从而继续在for里跑。
当在子线程里运行时:第一次直接调用信号处理函数发送请求,recvmsg正确接收到了,当第二次信号处理函数由定时器每五秒异步发生时,recvmsg 被中断,也同样返回-1 给n,但是errno并未置为EINTR,用输出语句得到errno的值为0,从而执行err_sys("recvmsg eror"); 错误处理并退出结束了线程。

不明白为什么相同的代码,为什么在子线程中会出错。请大家指教!谢谢啦

|
同问。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ***对一个中断机制的疑惑***
  • 关于中断处理程序的一点疑惑?
  • 第一次遇到这个“简单”的继承问题,疑惑疑惑疑惑啊
  • 我的关于BS结构的疑惑
  • ps命令状态码疑惑
  • 关于学linux的一点疑惑
  • epoll多路复用模型的疑惑,请高手解答
  • 操作系统对于"堆"内存的管理,一个疑惑
  • 关于classpath的疑惑
  • 关于CheckboxGroup的疑惑
  • 使用"<jsp:forward...>"的疑惑
  • 关于import的疑惑
  • 一个关于linux源代码的疑惑
  • 请问应用服务器本身也是采用多层结构吗?疑惑中。
  • 菜鸟的疑惑!
  • 问一个很k的问题,请大虾解疑惑!on Line!!!
  • 初学者的疑惑:怎么才可以显示中文
  • 疑惑
  • signal的疑惑
  • 疑惑,怎么没人研究webmin 呢
  • 初学socket的疑惑
  • NFS:的疑惑?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3