Пример кода, который устанавливает 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 байтов в выводе.)