2011-09-02 5 views
5

이것은 약간의 컴퓨팅 시스템 101 질문처럼 보입니다. 그러나 나는 혼란 스럽습니다.내부적으로 캡처/리디렉션 stdout?

C/C++ 프로젝트 A의 기존 코드를 내 프로젝트 B에 통합하려고합니다. A와 B 모두 단일 실행 가능 스레드 프로세스로 링크됩니다. 프로젝트 A의 코드는 출력을 위해 printf를 광범위하게 사용합니다. 이것은 괜찮지 만, 그 출력을 내 버퍼에 포착하고 싶습니다. printf 호출이 일단 쓰여지면 stdout에서 읽을 수있는 방법이 있습니까? 프로세스 나 파이프를 포크 할 수 없습니다. 그리고 poll() stdout이나 dup()에 대한 내 노력은 성공하지 못했습니다. (나는 여기서 뭔가 잘못했을 수도 있습니다.)

+0

A의 출력을 B로 파이프 할 수 없습니까? ('$ commandprompt ./A |./B'). 둘 다 실행 파일이고 A가 B보다 먼저 실행될 수 있다고 가정합니다. –

+0

seprate 실행 파일로 유지하고 런타임시 파이프를 연결하는 것처럼 들리는 것처럼 들립니다. –

+0

불행히도, 아니오. A와 B는 하나의 exec로 링크되어야합니다. – MapMaker

답변

4

당신은 기술자를 변경하는 freopen을 사용할 수 있습니다로 만든 파이프.

#include<stdio.h> 

main(int argc, char** argv) { 
    FILE *fp = freopen("output.txt", "w", stdout); 
    printf("Hello\n"); 
    fclose(fp); 
} 

실행하면 outputfxt에 printf 출력이 표시되고 아무 것도 화면에 표시되지 않습니다.

이제 파일을 열어 데이터를 읽을 수 있습니다. 또는 심지어 mmap을 메모리 공간에 넣고 그런 식으로 처리 할 수 ​​있습니다.

0

일단 사라지면 사라집니다. 이 코드를 하나의 실행 파일로 모두 컴파일하려면 검색을 사용하여 A 코드를 찾아 교체해야하며 모든 printf 호출을 사용자 스트림으로 변환해야합니다.이 코드를 복사하여 전달할 수 있습니다 에 stdout.

+0

닉이 참으로 내가 구현하지만 단순히 여론 조사에 뭔가를하고 있던 것으로 기대 된 해결 방법이었다() 및 dup(). 아 글쎄, 앞으로 나아갈 시간이야! 답변 해주셔서 감사합니다. btw 나는 당신의 아이콘을 좋아한다 : – MapMaker

+0

그것은 플러시되고 그 일을하기 위해 간다. 파이프와 stdout에 대한 전체적인 생각은 응용 프로그램이 이러한 것들을 유지하지 않는다는 것입니다. 그들은 필요한만큼 버퍼링 한 다음 즉시 제거합니다. 그렇게하면 응용 프로그램을 서로 연결하는 데 많은 메모리가 필요하지 않습니다. 이전의 모든 출력이 나중에 사용할 수 있도록 모든 것을 설계하도록 설계하는 방법은 없습니다. –

+0

항상'#define printf (...) fprintf (myfile, __VA_ARGS __)' –

2

당신이()는 printf 전에 전략 중 하나를 닫을 수 있으며, dup2가()는 FD 1.

+0

... fd 1을 닫을 필요가 없습니다.'dup2'가 당신을 대신해 줄 것입니다. – dragonroot

1

말할 필요도없이 : stdout과 stderr를 아주 사소하게 리디렉션하는 편리한 U-Streams C 소스 코드 라이브러리가 있습니다. 또한 여러 대상으로 매우 쉽게 리디렉션 할 수 있습니다. 그리고 stdout과 stderr가 똑같은 방식으로 사용할 수있는 것 외에도 자신 만의 스트림을 만들 수 있습니다.

실제로 U-Streams C 라이브러리를 찾으십시오. 편리합니다.

관련 문제