рдЕрд╕реЗрдВрдмрд▓реА рд▓реИрдВрдЧреНрд╡реЗрдЬ рдореЗрдВ рдЧреЗрдо рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╖реНрдХреГрдд рд░реВрдк рдХреЛ рдореЙрд╕реНрдХреЛ рд╕реНрдЯреЗрдЯ рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдЯреА рдХреЗ VMK рдХреЗ рдкрд╣рд▓реЗ рд╡рд░реНрд╖ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрднреНрдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рдЧрддрд┐ рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдбреЙрд╕ рдФрд░ рдорд╕реНрдо рджреЛрдиреЛрдВ рдЗрддрд┐рд╣рд╛рд╕ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдирд╛рд╕реНрдорд╛ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХреБрдВрд╡рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдЧреЗ рдЖрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рджрд╕ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рд╕рдВрдХрд╛рдп рдХрд╛ рдиреЗрддреГрддреНрд╡ рдЕрдЬрдЧрд░ рдХреА рдЦреЛрдЬ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЕрд╕реЗрдВрдмрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдЕрдкрдиреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде, BIOS рдЗрдВрдЯрд░рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдПрдкреАрдЖрдИ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд▓рд╛рдареА рдпрд╛ рд╕рдореБрджреНрд░реА рдпреБрджреНрдз рдХрд╛ рдПрдХ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдбрд╝реА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рд╕рд╛рдВрдк рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рд╕рд┐рд╕реНрдЯрдо рдЯрд░реНрдорд┐рдирд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реА рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдХрд╛рдлреА рд╕рд░рд▓ рдЧреЗрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рджреЛ рдареЛрдХрд░реЗрдВ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИрдВ: рдЯрд░реНрдорд┐рдирд▓ рдХреЛ рдЧреИрд░-рд╡рд┐рд╣рд┐рдд рдореЛрдб рдореЗрдВ рдХреИрд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХреЛ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рдкрд░ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
1. рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЧреИрд░-рд╡рд┐рд╣рд┐рдд рдореЛрдб
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ C рдореЗрдВ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ C рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЯрд░реНрдорд┐рдирд▓ рдХреЛ рдЧреИрд░-рд╡рд┐рд╣рд┐рдд рдореЛрдб рдореЗрдВ рдмрджрд▓рдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рд╣реЗрд▓реНрдкрд░ рдХреЛрдб рдХреЛ рдЗрд╕рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ
рдпрд╣ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ GNU рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ:
struct termios saved_attributes; void reset_input_mode (void) { tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes); } void set_input_mode (void) { struct termios tattr; tcgetattr (STDIN_FILENO, &saved_attributes); tcgetattr (STDIN_FILENO, &tattr); tattr.c_lflag &= ~(ICANON|ECHO); tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); }
рдЗрд╕ рдХреЛрдб рдореЗрдВ, STDIN_FILENO рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ 0 рд╣реИ), ICANON рдЙрд╕реА рдХреИрдиреЛрдирд┐рдХрд▓ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдзреНрд╡рдЬ рд╣реИ, ECHO рд╕реНрдХреНрд░реАрди рдкрд░ рдЗрдирдкреБрдЯ рд╡рд░реНрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рд╣реИ, рдФрд░ TCSANOW рдФрд░ TCSAFLUSH рдкреБрд╕реНрддрдХрд╛рд▓рдп-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, "рдирдВрдЧреЗ" рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдВрдЪ рд╕реЗ рд░рд╣рд┐рдд, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
- рдореВрд▓ рд╢рдмреНрджрд╛рд╡рд▓реА рд╕рдВрд░рдЪрдирд╛ рд░рдЦреЗрдВ;
- ICANON рдФрд░ ECHO рдЭрдВрдбреЗ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ;
- рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрд░рдЪрдирд╛ рднреЗрдЬреЗрдВ;
- рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдмрдЪрд╛рдИ рдЧрдИ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп tcsetattr рдФрд░ tcgetattr рдХреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди
ioctl рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЙрдирдХреЗ рдХрд╛рдо рдХреА рдХреБрдВрдЬреА рд╣реИред рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЬреЛ рд▓реЗрддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0) рд╣реИ, рджреВрд╕рд░рд╛ рдЭрдВрдбреЗ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ TCSANOW рдФрд░ TCSAFLUSH рдореИрдХреНрд░реЛрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕реВрдЪрдХ рд╣реИ (рд╣рдорд╛рд░реЗ рдХреЗрд╕ рдЯрд░реНрдорд┐рдирд╕ рдореЗрдВ)ред Nasm рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдЕрдзрд┐рд╡реЗрд╢рди рдХреЗ рддрд╣рдд, рдпрд╣ рдирд┐рдореНрди рд░реВрдк рд▓реЗрдЧрд╛:
mov rax, 16 ; ioctl mov rdi, 0 ; mov rsi, TCGETS ; mov rdx, tattr ; syscall
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ tcsetattr рдФрд░ tcgetattr рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИред рдмрд╛рдХреА рдХреЛрдб рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯрд░реНрдорд┐рдирд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рднреА рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ 60 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдФрд░ рдЬрд┐рди рдЭрдВрдбреЛрдВ рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реЗ рдЖрдХрд╛рд░ рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ рдФрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЪреМрдереЗ рд╕реНрдерд╛рди рдкрд░ рд╣реИрдВред рдпрд╣ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХреЛрдб рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред
рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд, рдЗрд╕рдХрд╛ рд╕рд░рд▓рддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ POSIX рдорд╛рдирдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА OS рдкрд░ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдХреНрд░реЛ рдорд╛рди рдорд╛рдирдХ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдкреВрд░реНрд╡реЛрдХреНрдд рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд▓рд┐рдП рдЧрдП рдереЗред
рдЧреИрд░-рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдореЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг %define ICANON 2 %define ECHO 8 %define TCGETS 21505 ; %define TCPUTS 21506 ; global setcan ; global setnoncan ; section .bss stty resb 12 ; termios - 60 slflag resb 4 ;slflag 3*4 srest resb 44 tty resb 12 lflag resb 4 brest resb 44 section .text setnoncan: push stty call tcgetattr push tty call tcgetattr and dword[lflag], (~ICANON) and dword[lflag], (~ECHO) call tcsetattr add rsp, 16 ret setcan: push stty call tcsetattr add rsp, 8 ret tcgetattr: mov rdx, qword[rsp+8] push rax push rbx push rcx push rdi push rsi mov rax, 16 ;ioctl system call mov rdi, 0 mov rsi, TCGETS syscall pop rsi pop rdi pop rcx pop rbx pop rax ret tcsetattr: mov rdx, qword[rsp+8] push rax push rbx push rcx push rdi push rsi mov rax, 16 ;ioctl system call mov rdi, 0 mov rsi, TCPUTS syscall pop rsi pop rdi pop rcx pop rbx pop rax ret
2. рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдЗрдирдкреБрдЯ
рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕реВрдЪрдирд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕реНрдЯреНрд░реАрдо рдмрдлрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛: рдпрджрд┐ рдмрдлрд░ рдореЗрдВ рдХреЛрдИ рдкреНрд░рддреАрдХ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрдирд╛ рдХреЛрдб рд▓реМрдЯрд╛рдПрдЧрд╛; рдпрджрд┐ рдмрдлрд░ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдпрд╣ 0. рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ - рдкреЛрд▓ () рдпрд╛ рдЪрдпрди () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рддрдереНрдп рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рднреА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЖ рдЧрдИ рд╣реИ, рддреЛ рдпреЗ рджреЛрдиреЛрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рджрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдореЗрдВ рд╕реЗ рджреВрд╕рд░рд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдПрдХ рдЙрдиреНрдирдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдФрд░ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИ (рд╣рдо рдХреЗрд╡рд▓ рдорд╛рдирдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреЛрд▓ () рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
- рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ, рдЬрд┐рд╕рдореЗрдВ рдореЙрдирд┐рдЯрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ (рд╣рдо рдЗрд╕реЗ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ);
- рд╕рдВрд╕рд╛рдзрд┐рдд рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реИ);
- рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдПрдХ рдШрдЯрдирд╛ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рд╣рдореЗрдВ рддреБрд░рдВрдд рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ 0 рд╣реИ)ред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕реЗ рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рд╣реИ:
struct pollfd { int fd; short events; short revents; };
рдЗрд╕рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдо рдПрдХ рдорд╛рдирдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ 0 рд╣реИ), рдФрд░ рдЕрдиреБрд░реЛрдзрд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдмрдлрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдирд╛рдо POLLIN рд╣реИ рдФрд░ рдпрд╣ 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╣рдо рд▓реМрдЯреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рддрдм рд╡рд╛рдВрдЫрд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
section .data fd dd 0 ; eve dw 1 ; - POLLIN rev dw 0 ; section .text poll: nop push rbx push rcx push rdx push rdi push rsi mov rax, 7 ; poll mov rdi, fd ; mov rsi, 1 ; mov rdx, 0 ; syscall
рдкреЛрд▓ () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ "рджрд┐рд▓рдЪрд╕реНрдк" рдШрдЯрдирд╛рдПрдВ рд╣реБрдИ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧрд╛ рд╣реИ, рд╡рд╛рдкрд╕реА рдорд╛рди рдпрд╛ рддреЛ 1 рд╣реИ (рдЗрд╕рдореЗрдВ рджрд░реНрдЬ рдбреЗрдЯрд╛ рд╣реИ) рдпрд╛ 0 (рдХреЛрдИ рдирд╣реАрдВ рд╣реИ)ред рдпрджрд┐, рдлрд┐рд░ рднреА, рдмрдлрд░ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рддреБрд░рдВрдд рдПрдХ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ - рджрд░реНрдЬ рдЪрд░рд┐рддреНрд░ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝реЗрдВ рдФрд░ рдкрдврд╝реЗрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдорд┐рд▓рддреЗ рд╣реИрдВред
рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдЗрдирдкреБрдЯ section .data fd dd 0 ; eve dw 1 ; - POLLIN rev dw 0 ; sym db 1 section .text poll: nop push rbx push rcx push rdx push rdi push rsi mov rax, 7 ; poll mov rdi, fd ; mov rsi, 1 ; mov rdx, 0 ; syscall test rax, rax ; 0 jz .e mov rax, 0 mov rdi, 0 ; mov rsi, sym ; read mov rdx, 1 syscall xor rax, rax mov al, byte[sym] ; , .e: pop rsi pop rdi pop rdx pop rcx pop rbx ret
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдм рдЖрдк рд╕реВрдЪрдирд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдХреЛрдИ рдмрдЯрди рджрдмрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ 0 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдмреЗрд╢рдХ, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЦрд╛рдорд┐рдпрд╛рдВ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдПрд╕рд╕реАрдЖрдИ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддреАрди рдХрд╛рд░реНрдп (рд╕реЗрдЯрдХреИрди, рд╕реЗрдЯрдирдХреЙрди рдФрд░ рдкреЛрд▓) рдЕрдкрдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рдЗрдирдкреБрдЯ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд╡реЗ рд╕рдордЭрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЗрдо рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдиреНрд╣реЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рд╡реНрдпрд╡рд╕рд╛рдп рд╣реИред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
1)
tcgetattr рдФрд░ tcsetattr рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрд░реЛрдд ;
2)
ioctl рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдкреНрд░рд▓реЗрдЦрди ;
3)
рдкреЛрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд░ рдкреНрд░рд▓реЗрдЦрди ;
4)
рдЯрд░реНрдорд┐рдирд╕ рдкрд░ рдкреНрд░рд▓реЗрдЦрди ;
5)
рд▓рд┐рдирдХреНрд╕ x64 рдХреЗ рддрд╣рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ ред