在 Unix 上用 C 取消 UDP 接收
我刚刚开始学习 C 网络编程的工作原理,并且我编写了一个小程序,用于向 UNIX 终端发送消息或从 UNIX 终端发送消息。我在程序中使用 pthreads,其中一个线程本质上只是等待 recvfrom()
接收消息。
但是,如果用户选择退出程序,我希望能够正确关闭所有线程。按照我现在设置的方式,另一个线程只是取消等待recvfrom的线程,但我担心这可能不是一个好主意,因为我没有关闭套接字并且没有释放我的所有内存分配。
有没有办法取消 recvfrom()
调用,或者有什么方法可以在取消 pthread 时运行某个例程?
谢谢。
I'm just starting to learn how network programming in C works, and I've written a small program that sends messages to and from a UNIX terminal. I'm using pthreads in my program, one of which essentially just waits on recvfrom()
to receive a message.
However, I want to be able to close all threads properly if the users chooses to quit the program. The way I have it set up right now, a different thread just cancels the thread waiting on recvfrom, but I'm worried this might not be a good idea since I'm leaving sockets unclosed and I'm not freeing all the memory I allocated.
Is there a way to cancel a recvfrom()
call, or some way to run a certain routine upon cancelling a pthread?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您使用
pthread_kill
向线程发送信号,recvfrom()
应返回 -1,并将errno
设置为EINTR - 然后您可以检查“应用程序正在退出”条件并优雅地完成。
If you use
pthread_kill
to send a signal to the thread,recvfrom()
should return -1 witherrno
set toEINTR
- you can then check for the "application is now exiting" condition and finish up gracefully.另一种方法是维护与线程 ID 匹配的打开连接列表。然后,每当您取消线程时,都会通过列表查找它的套接字并调用套接字上的 close 。
Another approach would be to maintain a list of open connection matched with thread id's. Then whenever you cancel a thread go through the list to find it's socket and call close on the socket.