当前位置: 技术问答>linux和unix
linux下recvfrom阻塞状态下退出的问题
来源: 互联网 发布时间:2017-05-02
本文导语: 控制器上linux主线程main(不异常永远不会退出)创建了常驻线程inA(不异常永远不会退出)来接收来自socketA网络地址和端口的数据, 当上位机PC软件给控制器的socketA网络地址和端口发送数据: 1.如果socketA网络地址和端口...
控制器上linux主线程main(不异常永远不会退出)创建了常驻线程inA(不异常永远不会退出)来接收来自socketA网络地址和端口的数据,
当上位机PC软件给控制器的socketA网络地址和端口发送数据:
1.如果socketA网络地址和端口的数据命令是启动socketB网络地址和端口的数据接收时,常驻线
程inA会创建线程inB,并且调用pthread_detach(inB)断开自己与inB的关系,而线程inB
以阻塞方式循环调用recvfrom来接收socketB网络地址和端口的数据。
2.如果socketA网络地址和端口的数据命令是关闭socketB网络地址和端口的数据接收时,常驻线程inA
会关闭socketB网络地址和端口,使socketB网络地址和端口的recvfrom从阻塞中跳出,并线程inB自己跳出循环,线程inB运行结束,自己释放自己占用的资源。
常驻线程inA怎么让线程inB的recvfrom从阻塞中跳出?
仅close(socketB)不能让线程inB的recvfrom从阻塞中跳出
当上位机PC软件给控制器的socketA网络地址和端口发送数据:
1.如果socketA网络地址和端口的数据命令是启动socketB网络地址和端口的数据接收时,常驻线
程inA会创建线程inB,并且调用pthread_detach(inB)断开自己与inB的关系,而线程inB
以阻塞方式循环调用recvfrom来接收socketB网络地址和端口的数据。
2.如果socketA网络地址和端口的数据命令是关闭socketB网络地址和端口的数据接收时,常驻线程inA
会关闭socketB网络地址和端口,使socketB网络地址和端口的recvfrom从阻塞中跳出,并线程inB自己跳出循环,线程inB运行结束,自己释放自己占用的资源。
常驻线程inA怎么让线程inB的recvfrom从阻塞中跳出?
仅close(socketB)不能让线程inB的recvfrom从阻塞中跳出
|
建议你不要用recvfrom阻塞式的方式实现,改用select非阻塞式,给一个超时时间,这样就很好解决你的问题了
|
1 最好的办法 设置recvfrom 为非阻塞模式!收到关闭的消息的时候就直接关闭就好!
2 另外一个就是通过shutdown函数把recvfrom函数从阻塞模式中唤醒,然后再关闭socket