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



我写了一个简单的NASM程序:

打印测试.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

似乎什么都没做

我确信我从根本上误解了这里的一些东西。

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

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

最新更新