2016-06-23 21 views
0

-Code arbeiten:Linux-Programmierung, stdout Rohr nicht vor execve

#include <stdio.h> 
#include <unistd.h> 
int main(int argc, char *argv[]) 
{ 
    printf("test output\n"); 
    execv("/bin/date", argv); 
    return 0; 
} 

Dann kompilieren und ausführen:

[email protected]:~/test/$ ./a.out 
test output 
Thu Jun 23 17:44:06 CST 2016 

[email protected]:~/test/1$ ./a.out | tee 
Thu Jun 23 17:44:09 CST 2016 

"Testausgang" nicht wenn Rohr Verwendung gezeigt.

Und verwenden ltrace und strace zu debuggen, ich habe:

$ strace ./a.out | tee 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb766e000 
write(1, "Thu Jun 23 17:48:58 CST 2016\n", 29Thu Jun 23 17:48:58 CST 2016 
) = 29 
close(1) 

$ ltrace ./a.out | tee 
__libc_start_main(0x8048414, 1, 0xbff5fd44, 0x8048470, 0x8048460 <unfinished ...> 
puts("test output")                                = 12 
execv("/bin/date", 0xbff5fd44 <unfinished ...> 
--- Called exec() --- 
...... 
fwrite("Thu", 3, 1, 0xe024e0)                              
strftime(" Jun", 1024, " %b", 0x00e056a0) 
..... 

In Bezug auf "Testausgang", das Programm als "puts", dann ist dies libc Bibliothek Aufruf, aber die der Kernel "write" tat‘ t angerufen. Warum ?

Antwort

1

Nach einigem Suchen, Hinzufügen fflush (stdout):

#include <stdio.h> 
#include <unistd.h> 
int main(int argc, char *argv[]) 
{ 
    printf("test output\n"); 
    flush(stdout); 
    execv("/bin/date", argv); 
    return 0; 
} 

und arbeitet:

[email protected]:~/test/1$ ./a.out | tee 
test output 
Thu Jun 23 18:17:09 CST 2016