我遇到了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");
输出:
在那之后什么都没得到...
甚至
sockaddr
的值为3(小于FD_SETSIZE
= 1024);我可以将
FD_SET
应用于套接字,可以接近套接字吗?可能是什么原因?
最佳答案
它不太可能卡在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)
跟随这些行,那么结果将是您只在等待ojit_code文件描述符变得可读(读取时不阻塞)。
还要确保sockaddr
是readfd
,并且fd_set
和s
是描述符(例如sockaddr
和socket(2)
返回)。否则,事情就没有意义了。
关于c - 程序在Linux用户空间中的FD_SET宏处挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29143584/