当前位置: 技术问答>linux和unix
标准输入描述符是0,造成select识别异常
来源: 互联网 发布时间:2016-05-18
本文导语: 写了一个select的测试程序,以标准输入作为测试,出现了一个问题。 在运行 select的时候,程序中采用循环设置FD_ZERO,清空readfds. 敲入回车键,FD_ISSET检测到标准输入有数据。但是在下一次循环中不敲入回车还是被告...
写了一个select的测试程序,以标准输入作为测试,出现了一个问题。
在运行 select的时候,程序中采用循环设置FD_ZERO,清空readfds.
敲入回车键,FD_ISSET检测到标准输入有数据。但是在下一次循环中不敲入回车还是被告知标准输入有数据。
这个问题是否是由于标准输入,描述符是0造成的呢?
一下程序可以运行。
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
struct timeval tv;
fd_set readfds;
int select_rtn;
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
// 将所有的文件描述符加入
FD_SET(0, &readfds);
/* don't care about writefds and exceptfds: */
while(1)
{
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET(0, &readfds);
select_rtn = select(0+1, &readfds, NULL, NULL, NULL);
//sleep(1);
printf("select_rtn %dn", select_rtn);
if (select_rtn == -1)
{
printf("将退出,select出错! %s", strerror(errno));
break;
} else if (select_rtn == 0)
{
printf ("没有任何消息到来,用户也没有按键,继续等待……n");
continue;
}
else
{
if (FD_ISSET(0, &readfds))
printf("A key was pressed!n");
else
printf("Timed out.n");
}
sleep(1);
}
return 0;
}
在运行 select的时候,程序中采用循环设置FD_ZERO,清空readfds.
敲入回车键,FD_ISSET检测到标准输入有数据。但是在下一次循环中不敲入回车还是被告知标准输入有数据。
这个问题是否是由于标准输入,描述符是0造成的呢?
一下程序可以运行。
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
struct timeval tv;
fd_set readfds;
int select_rtn;
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
// 将所有的文件描述符加入
FD_SET(0, &readfds);
/* don't care about writefds and exceptfds: */
while(1)
{
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET(0, &readfds);
select_rtn = select(0+1, &readfds, NULL, NULL, NULL);
//sleep(1);
printf("select_rtn %dn", select_rtn);
if (select_rtn == -1)
{
printf("将退出,select出错! %s", strerror(errno));
break;
} else if (select_rtn == 0)
{
printf ("没有任何消息到来,用户也没有按键,继续等待……n");
continue;
}
else
{
if (FD_ISSET(0, &readfds))
printf("A key was pressed!n");
else
printf("Timed out.n");
}
sleep(1);
}
return 0;
}
|
但是在下一次循环中不敲入回车还是被告知标准输入有数据。
有缓冲区的。
有缓冲区的。
|
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 int main(int argc, char *argv[])
8 {
9 struct timeval tv;
10 fd_set readfds;
11 int select_rtn;
12 char str[50];
13 tv.tv_sec = 2;
14 tv.tv_usec = 500000;
15
16 while(1)
17 {
18 tv.tv_sec = 2;
19 tv.tv_usec = 500000;
20 FD_ZERO(&readfds);
21 FD_SET(0, &readfds);
22 select_rtn = select(0+1, &readfds, NULL, NULL, NULL);
23 printf("select_rtn %dn", select_rtn);
24 if (select_rtn == -1)
25 {
26 printf("将退出,select出错! %s", strerror(errno));
27 break;
28 } else if (select_rtn == 0)
29 {
30 printf ("没有任何消息到来,用户也没有按键,继续等待……n");
31 continue;
32 }
33 else
34 {
35 if (FD_ISSET(0, &readfds)) {
36 printf("A key was pressed!n");
37 read(0,str,50);
38 printf("Your input is :%sn", str);
39 }
40 else
41 printf("Timed out.n");
42 }
43 sleep(1);
44 }
45 return 0;
46 }
2 #include
3 #include
4 #include
5 #include
6 #include
7 int main(int argc, char *argv[])
8 {
9 struct timeval tv;
10 fd_set readfds;
11 int select_rtn;
12 char str[50];
13 tv.tv_sec = 2;
14 tv.tv_usec = 500000;
15
16 while(1)
17 {
18 tv.tv_sec = 2;
19 tv.tv_usec = 500000;
20 FD_ZERO(&readfds);
21 FD_SET(0, &readfds);
22 select_rtn = select(0+1, &readfds, NULL, NULL, NULL);
23 printf("select_rtn %dn", select_rtn);
24 if (select_rtn == -1)
25 {
26 printf("将退出,select出错! %s", strerror(errno));
27 break;
28 } else if (select_rtn == 0)
29 {
30 printf ("没有任何消息到来,用户也没有按键,继续等待……n");
31 continue;
32 }
33 else
34 {
35 if (FD_ISSET(0, &readfds)) {
36 printf("A key was pressed!n");
37 read(0,str,50);
38 printf("Your input is :%sn", str);
39 }
40 else
41 printf("Timed out.n");
42 }
43 sleep(1);
44 }
45 return 0;
46 }
|
smart question.
楼上抢答也忒快,不然我还以为是我的盘中餐.
一时技痒,也写了一个类似writeset.
楼上抢答也忒快,不然我还以为是我的盘中餐.
一时技痒,也写了一个类似writeset.
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFSIZE 4096
int
main(int argc, char **argv)
{
char buf[BUFSIZE];
int n, ret, pfd[2];
pid_t pid;
fd_set writeset;
if (pipe(pfd)