程序挂起在Linux用户空间中的FD_SET宏

时间:2015-03-19 11:37:18

标签: c linux sockets

我遇到了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可以接近套接字吗? 可能是什么原因?

1 个答案:

答案 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文件描述符变得可读(在读取时不阻止) )。

同时确保readfdfd_setssockaddr为描述符(例如socket(2)open(2)返回)。否则,事情没有意义。