我遇到了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)跟随这些行,那么结果将是您只在等待o​​jit_code文件描述符变得可读(读取时不阻塞)。

还要确保sockaddrreadfd,并且fd_sets是描述符(例如sockaddrsocket(2)返回)。否则,事情就没有意义了。

关于c - 程序在Linux用户空间中的FD_SET宏处挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29143584/

10-13 05:13