我有以下情况我有一个程序在文件上连续进行一组操作,我想在按下特定键时停止并执行另一组操作。
为此,我尝试使用
字符的scanf
fcntl(0, F_SETFL, O_NONBLOCK);
和
while(feof(stdin))
但它没有按预期工作。
我搜索过,在某些地方有人说使用select
,但我找不到如何使用它。
任何人都能以某种方式向我提出建议?
我的主要功能是提供更多信息:
int main(int argc, char *argv[])
{
if(argc>1){
char* password;
char* password2;
printf("Password? ");
password = get_password();
printf("Repita a password? ");
password2 = get_password();
if(strcmp(password,password2)!=0){
printf("Passwords diferentes!\n");
exit(1);
}
FILE *fptr;
fptr = fopen("./regist", "r");
if(fptr == NULL) //if file does not exist, create it
{
fptr = fopen("./regist", "w");
}
fclose(fptr);
if(find_username(argv[1])){
printf("Utilizador ja existe\n");
exit(1);
}
add_user_regist(argv[1],password);
printf("Utilizador %s adicionado.\n",argv[1]);
exit(0);
}
char readbuf[250];
/* Create the FIFO if it does not exist */
umask(0);
mknod(FIFO_FILE, S_IFIFO|0666, 0);
printf("Servidor iniciado.\nEm modo de espera de mensagens\n");
fcntl(0, F_SETFL, O_NONBLOCK);
while(1){
char c = getchar();
if(c=='q' || c=='Q')
exit(0);//by now only goes out
fp = fopen(FIFO_FILE, "r");
fgets(readbuf, 250, fp);
fclose(fp);
if(readbuf[0]=='U')
user_access(readbuf);
else if(readbuf[0]=='W')
who_online(readbuf);
else if(readbuf[0]=='R'){
char* tmp;
strtok(readbuf,":");
tmp = strtok(NULL,";");
remove_online(tmp);
printf("# %s fez logout\n",tmp);
}
else if(readbuf[0]=='F'){
process_msg(readbuf);
}
}
return(0);
}
答案 0 :(得分:2)
查看NCurses,这是任何类型的高级终端软件的首选库。
除此之外,它还为您提供了做" raw"终端I / O - 使用int getch( void )
,通过int nodelay( WINDOWS * win, bool bf )
进行非阻止呼叫。
这阻止:
#include <ncurses.h>
int main()
{
initscr();
printw( "Press a key:\n" );
int c = getch();
endwin();
}
如果没有待处理的输入,则不会返回ERR
:
#include <ncurses.h>
int main()
{
initscr();
printw( "Press a key:\n" );
nodelay( stdscr, TRUE );
int c = getch();
endwin();
}
请注意,NCurses自带一组I / O函数,您必须使用这些函数而不是<stdio.h>
函数(请查看上面的printw()
)。
答案 1 :(得分:2)
使用GNU Readline替代termios / ncurses:
#include <readline/readline.h>
#include <stdio.h>
static int func(int count, int key)
{
printf ("key pressed: %c\n", key); /* exec your function */
return 0;
}
int main(void)
{
char *line;
rl_bind_key('x', func); /* 'x' is the specific key */
line = readline ("> ");
printf("%s\n", line);
return 0;
}
使用-lreadline