2016-06-23 6 views
0

코드 전에 작동하지 :리눅스 프로그래밍, 파이프 표준 출력이는 execve

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

그런 다음 컴파일하고 실행합니다

[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 

"시험 출력" 사용 파이프 표시되지.

그리고 디버깅은 ltrace 및 strace를을 사용하여, 내가 가진 : "시험 출력"에 관한

$ 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) 
..... 

, 프로그램은 "풋"호출 '이 된 libc 라이브러리 호출이지만, 커널 "쓰기"했다 t 전화 했어. 왜 ?

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

을 그리고 작동 :

답변

1

일부 검색 후, FFLUSH (표준 출력)를 추가

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