Package: libstdc++3 Version: 1:3.0.2-3 Severity: normal Hi!
I have seen an strange behaviour of libstdc++ regarding buffering of streams; I don't know if it is my fault or the libraries fault. It basically writes character per character whenever I do a cout << "something". Given the following program: #include <iostream> using namespace std; int main (void) { cout << "Hello world!" << endl; return 0; } compiled it with gcc-2.95 and gcc-3.0 (ok, g++ actually). When compiled with gcc-2.95 and run with strace(1), I get the following: $ g++-2.95 -Wall -O2 testout.cc -o testout $ ./testout Hello world! $ strace ./testout > /dev/null execve("./testout", ["./testout"], [/* 28 vars */]) = 0 uname({sys="Linux", node="milikk", ...}) = 0 brk(0) = 0x8049834 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=66967, ...}) = 0 old_mmap(NULL, 66967, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40016000 close(3) = 0 open("/usr/lib/libstdc++-libc6.2-2.so.3", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\251\1"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0644, st_size=291720, ...}) = 0 old_mmap(NULL, 303748, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40027000 mprotect(0x4005e000, 78468, PROT_NONE) = 0 old_mmap(0x4005e000, 69632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x36000) = 0x4005e000 old_mmap(0x4006f000, 8836, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4006f000 close(3) = 0 open("/lib/libm.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 I\0\000"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0644, st_size=134668, ...}) = 0 old_mmap(NULL, 137220, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40072000 mprotect(0x40093000, 2052, PROT_NONE) = 0 old_mmap(0x40093000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x40093000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0(\327\1"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1171196, ...}) = 0 old_mmap(NULL, 1187968, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40094000 mprotect(0x401ac000, 41088, PROT_NONE) = 0 old_mmap(0x401ac000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x117000) = 0x401ac000 old_mmap(0x401b2000, 16512, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x401b2000 close(3) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x401b7000 munmap(0x40016000, 66967) = 0 fstat64(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE, 0xbffff718) = -1 ENOTTY (Inappropriate ioctl for device) old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40016000 write(1, "Hello world!\n", 13) = 13 _exit(0) = ? Note the previous-to-last line, write(1, "Hello world!\n", 13), that is, a buffered write, as expected. However, now let's do the same with 3.0: $ g++-3.0 -Wall -O2 testout.cc -o testout $ ./testout Hello world! $ strace ./testout > /dev/null execve("./testout", ["./testout"], [/* 28 vars */]) = 0 uname({sys="Linux", node="milikk", ...}) = 0 brk(0) = 0x804c890 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=66967, ...}) = 0 old_mmap(NULL, 66967, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40016000 close(3) = 0 open("/usr/lib/libstdc++.so.3", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260\255"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0644, st_size=565536, ...}) = 0 old_mmap(NULL, 587464, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40027000 mprotect(0x4009e000, 100040, PROT_NONE) = 0 old_mmap(0x4009e000, 81920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x76000) = 0x4009e000 old_mmap(0x400b2000, 18120, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400b2000 close(3) = 0 open("/lib/libm.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 I\0\000"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0644, st_size=134668, ...}) = 0 old_mmap(NULL, 137220, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x400b7000 mprotect(0x400d8000, 2052, PROT_NONE) = 0 old_mmap(0x400d8000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x400d8000 close(3) = 0 open("/lib/libgcc_s.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\330\22"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0644, st_size=27180, ...}) = 0 old_mmap(NULL, 30220, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x400d9000 mprotect(0x400df000, 5644, PROT_NONE) = 0 old_mmap(0x400df000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x5000) = 0x400df000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0(\327\1"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1171196, ...}) = 0 old_mmap(NULL, 1187968, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x400e1000 mprotect(0x401f9000, 41088, PROT_NONE) = 0 old_mmap(0x401f9000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x117000) = 0x401f9000 old_mmap(0x401ff000, 16512, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x401ff000 close(3) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40204000 munmap(0x40016000, 66967) = 0 brk(0) = 0x804c890 brk(0x804c8c8) = 0x804c8c8 brk(0x804d000) = 0x804d000 brk(0x804e000) = 0x804e000 fstat64(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE, 0xbffff654) = -1 ENOTTY (Inappropriate ioctl for device) old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40016000 write(1, "H", 1) = 1 write(1, "e", 1) = 1 write(1, "l", 1) = 1 write(1, "l", 1) = 1 write(1, "o", 1) = 1 write(1, " ", 1) = 1 write(1, "w", 1) = 1 write(1, "o", 1) = 1 write(1, "r", 1) = 1 write(1, "l", 1) = 1 write(1, "d", 1) = 1 write(1, "!", 1) = 1 write(1, "\n", 1) = 1 munmap(0x40016000, 4096) = 0 _exit(0) = ? And puf! there you have it, unbuffered, one char at a time, super innefective writes. I tried to investigate and found nothing. I was thinking maybe there is a switch for it or something, but found none. Anyway, by default, the output should be buffered, AFAIK ... and unless I am missing anything. Any clues? Thanks!!! -- System Information Debian Release: testing/unstable Kernel Version: Linux milikk 2.4.10.2-milikk #1 SMP mar oct 30 15:30:23 PST 2001 i686 unknown Versions of the packages libstdc++3 depends on: ii gcc-3.0-base 3.0.2-3 The GNU Compiler Collection (base package). ii libc6 2.2.4-6 GNU C Library: Shared libraries and Timezone ii libgcc1 3.0.2-3 GCC support library.