- 论坛徽章:
- 0
|
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/select.h>
#include <signal.h>
#include <termios.h>
struct termios ttyOldStats; // 终端属性
bool change_command_mode()
{
struct termios ttyState;
ttyState = ttyOldStats;
ttyState.c_lflag &= ~ICANON;
ttyState.c_lflag &= ~ECHO;
ttyState.c_cc[VMIN] = 1;
ttyState.c_iflag &= ~ISIG;
tcsetattr(0, TCSANOW, &ttyState);
return true;
}
bool change_input_mode()
{
tcsetattr(0, TCSANOW, &ttyOldStats);
return true;
}
bool ctrl_c = false;
void int_func(int sig)
{
ctrl_c = true;
}
int main()
{
int ch; /* 取得的字符 */
tcgetattr(0, &ttyOldStats);
change_command_mode(); /* 设置为命令模式,立即返回控制台输入 */
signal(SIGINT, int_func); /* ctrl-c 信号处理 */
fd_set readset;
struct timeval timeout = {1000, 1000};
FD_ZERO(&readset);
FD_SET(STDIN_FILENO, &readset);
while(1){
int temp;
temp = select(STDIN_FILENO + 1, &readset, NULL, NULL, &timeout);
if(temp > 0){
/* 有输入 */
ch = getchar(); /* 取得一个按键 */
printf("input char: %d\n", ch);
}else{
/* 超时或错误 */
if(ctrl_c == true){
printf("ctrl -c\n");
ctrl_c = false;
}
}
}
change_input_mode();
exit(0);
}
现在我想要的结果是按一个建打印这个建的值,按ctrl-c打印“ctrl-c”,
上面实用select阻塞io,好象不可以
但是我去掉select,直接用getchar如果ctrl-c之后不会返回,getchar改为read函数也不会返回,
请问怎么实现这个功能,谢谢? |
|