我遇到了FD_SET
的问题。我使用套接字CAN方法并使用recvfrom
在Linux中访问CAN。由于它是阻塞调用,我想使用select
系统调用。我的程序挂起@ FD_SET
宏。它适用于FD_CLR
宏。
代码:
FD_ZERO(&readfd);
printf("\n 1.1");
FD_CLR(s, &readfd);
printf("\n 1.2");
FD_SET(sockaddr,&readfd); //hangs here
printf("\n 1.3");
输出:
1.1
1.2
之后没有得到任何东西......
即使sockaddr
值为3(小于FD_SETSIZE
= 1024);
我可以将FD_SET
应用于socket可以接近套接字吗?
可能是什么原因?
答案 0 :(得分:3)
它不太可能挂在FD_SET()
。更有可能的是stdout
是一个终端,在这种情况下,你的C库会进行行缓冲,这样只有在看到终止换行符后才会将每一行发送到终端。
尝试例如相反printf("1.3\n")
(或仅puts("1.3")
,这是同样的事情,也更简单)。您也可以使用调试器。
(如果stdout
是常规文件,请在打印“1.3”之后在其上执行fflush(stdout)
5gon12eder在评论中提出。无论fflush()
是终端还是常规文件(将使用块缓冲),stdout
都将起作用,因此这是一种更好的解决方案。另一种方法是使用stderr
,默认情况下是无缓冲的。)
FD_CLR(s, &readfd)
之后的 FD_ZERO(&readfd)
顺便说一句。 FD_ZERO()
已清除fd_set
readfd
。
至于真正的问题(挂起):
FD_CLR(s, &readfd)
之后你正在做FD_ZERO(&readfd)
可能表明你误解了select(2)
的工作方式。如果您使用select(FD_SETSIZE, &readfd, NULL, NULL, NULL)
跟随这些行,那么结果将是您仅等待sockaddr
文件描述符变得可读(在读取时不阻止) )。
同时确保readfd
为fd_set
,s
和sockaddr
为描述符(例如socket(2)
和open(2)
返回)。否则,事情没有意义。