同一个fd可以在select中用于读写

问题描述 投票:0回答:4

我希望使用相同的套接字 fd 进行读取和写入操作。假设“fd”是我正在研究的那个,在这种情况下

FD_SET(fd, &readfd);  
FD_SET(fd,&writefd);

select(fd+1, &readfd, &writefd, 0,200):

会保持良好状态,否则会返回错误。

我认为由于 writefd 和 readfd 是不同的集合,因此可以在这两个集合中设置相同的 fd。如果我错了请纠正我。

我可以在 poll POLLIN 和 POLLOUT 中对同一个 fd 执行相同的行为吗?

c linux windows linux-kernel posix-select
4个回答
5
投票

这是可以的,也是监控同一个文件读写的正确方法。 select 的最后一个参数是一个 struct timeval,而不是一个整数。


1
投票

超时值应该是一个struct timeval。

struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
int iResult = select(fdmax+1, &read_fds, &write_fds, NULL, &tv) ;

0
投票

已经有一段时间了,但如果我没记错的话,那就完全没问题了。


0
投票

是的,同一个fd可以同时放入写集合和读集合中。

如果在fd上接收数据,readfd会触发并返回。

如果您在 fd 上发送数据,当缓冲区中有足够的空间来发送数据时,writefd 将触发。

© www.soinside.com 2019 - 2024. All rights reserved.