我写了一个简单的NASM程序:
printtest.asm
section .data
str_out db "val = %d",10,0
section .text
global main
extern printf
main:
PUSH 5
PUSH DWORD str_out
CALL printf
ADD ESP, 8
MOV EAX, 1
INT 80h
我使用以下命令链接并创建可执行文件:
nasm -f elf -l printtest.lst printtest.asm
gcc -o printtest printtest.o
链接并执行时,这会将“val = 5”打印到控制台没问题。据我所知,默认情况下调用printf
会在stdout
上写入。那么为什么当我尝试将其传输到另一个程序时,其他程序似乎没有收到任何输入?
E.g
./printtest | cat
似乎什么都不做
我确信我从根本上误解了一些事情。
答案 0 :(得分:11)
默认情况下,可以缓冲C stdio函数,因此使用printf
写入stdout并不总是实际输出任何内容 - 有时它只是写入缓冲区,等待后续刷新。通常,给定的stdio流是否被缓冲取决于它是连接到终端,管道还是文件或其他东西。
当你调用退出系统调用时(和你一样),仍然在缓冲区中的任何数据都将丢失。如果您改为调用C库exit
函数,它将在实际退出之前刷新所有缓冲区。