当前位置: 技术问答>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"); 错误处理并退出结束了线程。
不明白为什么相同的代码,为什么在子线程中会出错。请大家指教!谢谢啦
单独编译成一个独立的可执行文件能正常运行。当我将此源代码用线程的形式在一个子线程中执行时,达不到预期的结果。
出问题的关键的代码如下:
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"); 错误处理并退出结束了线程。
不明白为什么相同的代码,为什么在子线程中会出错。请大家指教!谢谢啦
|
同问。