рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЦрд╛рд▓реА рд╕рдордп рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реАред рдХреЗ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЕрдм рддрдХ, рд╡реЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдерд╛рди рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХрд╛рд░реНрдп рдФрд░ рдПрд╕ред рдкреНрд░реЗрдЯ рдХреА рдкреБрд╕реНрддрдХ "рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ" рдХреЗ рд╕реНрддрд░ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рд╕рд╛рдВрдкреЛрдВ рдХреЗ рд╕рд╛рдВрдк рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рдЙрд╕ рд╕рдордп рддрдХ рдЬрдм рдЦреЗрд▓ рдореИрджрд╛рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рд╛рдВрдк рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореИрджрд╛рди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреАрдВ:

рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдк рд╕реЗ рдЧреЛрдЪ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдмрд╛рдК рдерд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рдерд╛ред
рдХрдЯ рдХреЗ рддрд╣рдд рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ getc () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ Enter рджрдмрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд░реНрдг рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдПрдХ рдЫреЛрдЯреА рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдПрдХ getc () рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд▓рд┐рдирдХреНрд╕ рдЯрд░реНрдорд┐рдирд▓ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреИрдиреЛрдирд┐рдХрд▓ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдпрд╣ рдЯрд░реНрдорд┐рдирд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдПрдВрдЯрд░ рджрдмрд╛рдХрд░ рд▓рд╛рдЗрди рдЗрдирдкреБрдЯ рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдЯрдб рдкрд░ рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рднреА рдкрд╛рдпрд╛ рдЧрдпрд╛: рдЪрд╛рд▓рдХ рдХреЛ рдЧреИрд░-рд╡рд┐рд╣рд┐рдд рдореЛрдб рдореЗрдВ рд░рдЦрдирд╛ред рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ termios.h рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рджреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ:
рдЧреИрд░-рд╡рд┐рд╣рд┐рдд рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп:
void set_keypress(void) { struct termios new_settings; tcgetattr(0,&stored_settings); new_settings = stored_settings; /*              1  */ new_settings.c_lflag &= (~ICANON); new_settings.c_lflag &= (~ECHO); new_settings.c_cc[VTIME] = 0; new_settings.c_cc[VMIN] = 1; tcsetattr(0,TCSANOW,&new_settings); return; } 

рдЕрдкрдиреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп:
 void reset_keypress(void) { tcsetattr(0,TCSANOW,&stored_settings); return; } 

рд╕рдВрдЧреНрд░рд╣рд┐рдд_рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЪрд░ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
 static struct termios stored_settings; 

рдлрд┐рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдХреНрд░рдорд╢рдГ, рджреВрд╕рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдорд╛рдкреНрдд рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 #include <stdlib.h> #include <stdio.h> #include <termios.h> #include <string.h> static struct termios stored_settings; void set_keypress(void) { struct termios new_settings; tcgetattr(0,&stored_settings); new_settings = stored_settings; new_settings.c_lflag &= (~ICANON & ~ECHO); new_settings.c_cc[VTIME] = 0; new_settings.c_cc[VMIN] = 1; tcsetattr(0,TCSANOW,&new_settings); return; } void reset_keypress(void) { tcsetattr(0,TCSANOW,&stored_settings); return; } int main(void) { set_keypress(); printf("Test: "); while(1) { // putchar    ,    putchar(getchar()); } return 0; } 

рдЕрдм рдореЗрд░рд╛ рд╕рд╛рдВрдк рдЪрд░рд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рд▓реЗрдХрд┐рди рдПрдХ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреА: рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрднреА рднреА рд░реБрдХрд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реБрдИ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдореИрдВ рдЕрдХреНрд╕рд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ "рд╕рдорд╛рдзрд╛рди" рднрд░ рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдерд╛ред рдЦреЛрдЬ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЪрдпрди () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдереАред
 int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *utimeout); 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ, рд╣рдо рдХреЗрд╡рд▓ n, readfds рдФрд░ utimeout рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:

рдЗрд╕рд▓рд┐рдП, рдХреЙрд▓рд┐рдВрдЧ рд╕реЗрд▓реЗрдХреНрдЯ () рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 select(1, &rfds, NULL, NULL, &tv); 

рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рд╕реНрдЯрдбрд┐рди, рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛
 FD_SET(0, &rfds); 

рд╕рдВрд░рдЪрдирд╛ рдХреА рд╕рдордп-рд╕реАрдорд╛ рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ:
 struct timeval { time_t tv_sec; /*  */ long tv_usec; /*  */ }; 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ (рдЯрд░реНрдорд┐рдирд▓ рдХреЛ рдЧреИрд░-рд╡рд┐рд╣рд┐рдд рдореЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рдерд╛):
 #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <termios.h> static struct termios stored_settings; void set_keypress(void) { struct termios new_settings; tcgetattr(0,&stored_settings); new_settings = stored_settings; new_settings.c_lflag &= (~ICANON & ~ECHO); new_settings.c_cc[VTIME] = 0; new_settings.c_cc[VMIN] = 1; tcsetattr(0,TCSANOW,&new_settings); return; } void reset_keypress(void) { tcsetattr(0,TCSANOW,&stored_settings); return; } int main(void) { fd_set rfds; struct timeval tv; int retval; set_keypress(); while(1) { FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; retval = select(2, &rfds, NULL, NULL, &tv); if (retval) { printf("Data is available now.\n"); getc(stdin); } else { printf("No data available.\n"); } usleep(100000); } reset_keypress(); exit(0); } 


рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА:


Source: https://habr.com/ru/post/In124789/


All Articles