为什么不能通过调用c库printf stdout asm被管道传输到其他程序?

Jak*_*ake 9 c linux assembly nasm

我写了一个简单的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
Run Code Online (Sandbox Code Playgroud)

我使用以下命令链接并创建可执行文件:

nasm -f elf -l printtest.lst printtest.asm
gcc -o  printtest printtest.o
Run Code Online (Sandbox Code Playgroud)

链接和执行时,这将打印"val = 5"没有问题.据我所知,printf默认情况下调用会写入stdout.那么为什么当我尝试将其传输到另一个程序时,其他程序似乎没有收到任何输入?

例如

./printtest | cat
Run Code Online (Sandbox Code Playgroud)

似乎什么都不做

我相信我从根本上误解了一些问题.

Chr*_*odd 11

默认情况下,可以缓冲C stdio函数,因此写入stdout printf并不总是实际输出任何内容 - 有时它只是写入缓冲区,等待后续刷新.通常,给定的stdio流是否被缓冲取决于它是连接到终端还是管道或文件或其他东西.

当您调用退出系统调用时(正如您所做),仍然在缓冲区中的任何数据都将丢失.如果您改为调用C库exit函数,它将在实际退出之前刷新所有缓冲区.