Skip to content
Advertisement

Why can’t stdout from calling c library printf in asm be piped to other programs?

I have written a simple NASM program:

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

I am linking and creating an executable with the following commands:

nasm -f elf -l printtest.lst printtest.asm
gcc -o  printtest printtest.o

When linked and executed, this prints “val = 5” to the console no problem. As far as I’m aware, calling printf by default writes on stdout. So why when I try and pipe this to another program does the other program seem to receive no input?

E.g

./printtest | cat

Seems to do nothing

I am sure I am fundamentally misunderstanding something here.

Advertisement

Answer

C stdio functions may be buffered by default, so writing to stdout with printf doesn’t always actually output anything — sometimes it just writes to the buffer, awaiting a subsequent flush. Often times, whether a given stdio stream is buffered or not depends on whether it is connected to a terminal or a pipe or a file or something else.

When you call the exit system call (as you do), any data still in buffers will be lost. If you instead call the C library exit function, it will flush all buffers before actually exiting.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement