当前位置: 技术问答>linux和unix
Linux 下非阻塞模式的简单问题,各位帮帮小弟
来源: 互联网 发布时间:2016-07-01
本文导语: #include #include #include #include #define ASK "Do you want another transaction" #define TRIES 3 #define SLEEPTIME 2 #define BEEP putchar('a') main(){ int response; tty_mode(0); set_cr_mode(); /// set_nodelay_mode(); response=get_response(ASK,TRIES); tty_mode(1); ret...
#include
#include
#include
#include
#define ASK "Do you want another transaction"
#define TRIES 3
#define SLEEPTIME 2
#define BEEP putchar('a')
main(){
int response;
tty_mode(0);
set_cr_mode();
/// set_nodelay_mode();
response=get_response(ASK,TRIES);
tty_mode(1);
return response;
}
get_response(char *question,int maxtries){
int input;
printf("%s (y/n)?",question);
fflush(stdout);
while(1){
input=tolower(get_ok_char());
if(input == 'y')
return 0;
if(input == 'n')
return 1;
if(maxtries-- == 0)
return 2;
BEEP;
}
}
get_ok_char(){
int c;
while((c=getchar())!=EOF && strchr("yYnN",c) == NULL)
;
return c;
}
set_cr_mode(){
struct termios ttystate;
tcgetattr(0,&ttystate);
ttystate.c_lflag &= ~ICANON;
ttystate.c_lflag &= ~ECHO;
ttystate.c_cc[VMIN] = 1;
ttystate.c_cc[VTIME] = 20;
tcsetattr(0,TCSANOW,&ttystate);
}
tty_mode(int how){
static struct termios original_mode;
static int original_flags;
if(how==0){
tcgetattr(0,&original_mode);
original_flags = fcntl(0,F_GETFL);
}
else{
tcsetattr(0,TCSANOW,&original_mode);
fcntl(0,F_SETFL,original_flags);
}
}
我的目的是等带用户输入,两秒过去后,若无输入,程序自动退出~~
可是它现在不能退出,我不知错在哪?各位帮帮忙~~
|
不要用getchar();
用:
fd_set fds;
struct timeval timeout;
int rc, result;
/* Set time limit. */
timeout.tv_sec = 2;
timeout.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN, &fds);
rc = select(STDIN + 1, &fds, NULL, NULL, &timeout);
if (rc==-1)
{
perror("select failed");
return -1;
}
用:
fd_set fds;
struct timeval timeout;
int rc, result;
/* Set time limit. */
timeout.tv_sec = 2;
timeout.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN, &fds);
rc = select(STDIN + 1, &fds, NULL, NULL, &timeout);
if (rc==-1)
{
perror("select failed");
return -1;
}
|
你的代码中哪有sleep后退出的实现部分?
#define SLEEPTIME 2都没用到。。
#define SLEEPTIME 2都没用到。。
|
用select控制最方便,建议使用
|
终端控制不熟,不过我觉得可以用select来实现,你只需要判断标准输入是否可读即可。