Чтение с неблокирующего ввода в NASM - PullRequest
0 голосов
/ 29 октября 2019

Пример кода, который устанавливает stdin как неблокирующий, затем выполняет системный вызов read.

section .text
    global  _start

_start:
    mov eax,    55           ; __NR_fcntl
    mov ebx,    0
    mov ecx,    4            ; F_SETFL
    mov edx,    2048         ; O_RDONLY|O_NONBLOCK
    int 0x80
    mov eax,    3            ; __NR_read
    mov ebx,    0
    mov ecx,    buf
    mov edx,    1024
    int 0x80
    mov [br],   eax
    mov eax,    4            ; __NR_write
    mov ebx,    1
    mov ecx,    buf
    mov edx,    [br]
    int 0x80
    mov eax,    1            ; __NR_exit
    mov ebx,    0
    int 0x80

section .bss
    buf resb    1024
    br  resd    1

Ожидаемое поведение: программа завершает работу без печати чего-либо, потому что я ожидаю, что read вернет 0 inEAX, когда нечего читать (на терминале).

Текущее поведение: программа печатает 4 случайных байта, поскольку read возвращает -11, когда ничего не было передано на стандартный ввод.

$ strace ./nonblocking 
execve("./nonblocking", ["./nonblocking"], 0x7fff196fcb40 /* 53 vars */) = 0
strace: [ Process PID=4112759 runs in 32 bit mode. ]
fcntl(0, F_SETFL, O_RDONLY|O_NONBLOCK)  = 0
read(0, 0x804a000, 1024)                = -1 EAGAIN (Resource temporarily unavailable)
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4294967285����) = 4096
exit(0)                                 = ?

(Примечание редактора: \0 печатается как терминалы нулевой ширины, но 4 ненулевые байты, о которых идет речь, - это -11 dword в br, начиная с 1024 байтов в выводе.)

...