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;
}
을 그리고 작동 :