vin*_*nit 5 c sockets linux select multithreading
我正在linux中设计一个C程序,我将有两个线程.一个主要线程是event_processor_thread,它执行主函数处理.第二个线程是一个始终在后台运行的event_dispatcher线程,实时写入和读取多个接口(非阻塞异步i/o)
我在网上做了一些研究,发现实现非阻塞套接字i/o的最佳方法可以通过
select()我选择了后者,因为它更容易,我将拥有最多4个接口来读/写.
我清楚听听/读取机制使用readfds,但我不确定如何使用writefds!如果我将event_processor_thread中的数据放入共享内存并让此事件调度程序线程从共享内存中读取并使用send(),则会选择将数据单独发送到套接字吗?这是我需要使用writefds的原因select()吗?
如果我的问题不明确,我很抱歉,我基本上想要的是拥有一个非阻塞的I/O线程来将事件分配到事件处理器线程或从事件处理器线程分配到外部接口.在这方面的任何投入都受到高度赞赏.谢谢!
Kla*_*äck 13
selectf的writefds用于检查文件描述符是否已准备好进行写入.对于套接字,这意味着与套接字关联的发送缓冲区未满.
假设您平台上的套接字具有8 kb缓冲区,并且您希望发送100 kb的数据.
您调用write并获得返回值8192,表示已写入前8192个字节.下一次write调用返回EAGAIN或EWOULDBLOCK指示发送缓冲区已满.
您现在可以使用select以查找何时再次发送缓冲区中的空间(即,当一个tcp/ip数据包已传输到客户端时),以便您可以继续写入.同时,您可以监听新连接并等待客户端的输入.
请注意,select从不发送任何数据,它只是一次监视多个文件描述符的状态.
不,select()不会“照顾写作”。当 writefds 集中包含的一个或多个文件描述符变得可写时,它会通知您。这可能意味着相关的 fd 已经完成了您之前所做的(非阻塞)写入,因此您现在可以执行另一个操作。