如何使用SIGINT

时间:2018-07-25 03:08:59

标签: c multithreading sockets select signals

我需要您的帮助来解决此问题。
我必须基于AF_UNIX在UNIX上创建一个多线程的客户端-服务器程序 套接字,必须处理多达数千个同时连接,并且还必须根据接收到的信号类型执行不同的操作,例如服务器收到SIGINT时关闭。

我考虑过这样做,首先禁用SIGINT和主线程的信号sigmask中的其他信号,然后启动一个调度线程,使(我知道这样做的效率很低)一直等待{{1} }用于I / 0请求,接受新的连接,然后精确地读取select()个字节,其中sizeof(request)是一个众所周知的结构,然后还创建一个线程来处理接收到的信号,唯一一个使用request重新启用信号,并最终启动另一个服务器线程以执行实际工作。

我有这个问题:

  • 即使调度程序线程卡在其中,我也想让sigwait()返回。我对此有一个自我欺骗技巧,但我认为我做错了,因为即使我让信号处理线程写入select的读取集中的管道中,{ {1}}将不会返回。我如何让select()返回?
  • 我已读过有关select()的内容,它可以有效地处理许多同时发生的连接。我应该使用它吗?我只读select()就不知道了,在我的教科书中甚至没有提到。
  • 有一些我可以用来处理系统故障的良好实践吗?我几乎检查每个系统调用的返回值,最终处理错误以释放内存和其他类似的东西,但是我的代码不断增长,并且几乎对于相同的操作重复了很多次。我如何编写一个清理函数,该函数可以在用epoll()返回之前释放内存?

无论如何,非常感谢您的帮助,这个平台真的很棒,当我得到更多专家时,我会回馈社区给我帮助!

(对不起,我的英语,但这不是我的母语)

0 个答案:

没有答案