문제

STDOUT 및 STDERR을 통해 앱을 시작하고 출력을 캡처하려면 어떻게해야합니까?

자동화 된 빌드 시스템을 작성하고 있으며 분석 할 출력을 캡처해야합니다. SVN Repo를 업데이트하고 개정 번호를 가져 와서 Autobuild/ Revnumber/ 성공한 경우 파일을 이동할 수 있습니다. 또한 Make를 사용하여 빌드하고 컴파일 텍스트를 서버에 업로드하여 모든 사람이 실패한 빌드에서 경고와 오류를 볼 수 있도록 내 서버에 업로드하고 싶습니다.

나는 찾을 수 없다 system() 기능이지만 나는 그것을 발견했다 CreateProcess() MSDN에서 기능. 필요한 것을 시작할 수는 있지만 Stderr와 Stdout을 캡처하는 방법을 전혀 모릅니다. 브레이크 포인트를 설정하고 내 앱을 종료하지 않으면 프로세스가 별도로 시작되는 것을 알 수 있습니다. 또한 모든 프로세스가 완료 될 때까지 기다린 다음 생성 된 데이터를 스캔하여 필요한 추가 작업을 수행하려고합니다. 이 일을 어떻게해야합니까?

도움이 되었습니까?

해결책

실제 껍질 (의미, 바다 껍질이 아닌 의미 - C 껍질이나 그 파생 상품이 아니라).

program arg1 arg2 >/tmp/log.file 2>&1

이것은 주어진 인수와 함께 프로그램을 실행하고 stdout을 /tmp/log.file로 리디렉션합니다. 표기법 (상형 문자) '2>&1'마지막에는 stderr (파일 디스크립터 2)를 stdout (파일 디스크립터 1)와 같은 장소로 보냅니다. 일련의 운영이 중요하다는 점에 유의하십시오. 반전되면 표준 오류가 표준 출력이 진행되는 곳으로 이동 한 다음 표준 출력 (표준 오류는 아님)이 파일로 리디렉션됩니다.

표시된 파일 이름의 선택은 여러 가지 이유로 심연입니다. 사용자가 디렉토리를 선택할 수 있어야하며 파일 이름에 프로세스 ID 또는 타임 스탬프를 포함시켜야합니다.

LOG=${TMPDIR:-/tmp}/log.$$.$(date +%Y%m%d-%H%M%S)
program arg1 arg2 >$LOG 2>&1

C ++에서는 사용할 수 있습니다 system() 프로세스를 실행하기 위해 함수 (C에서 상속). C ++ 프로그램 (plausible)에서 파일 이름을 알아야하는 경우 프로그램에서 이름을 생성합니다 (strftime() 친구입니다) 그리고 해당 파일 이름으로 명령 문자열을 만듭니다. (엄밀히, 당신도 필요합니다 getenv() $ tmpdir 및 posix 함수를 얻습니다 getpid() 프로세스 ID를 얻으려면 2 라인 쉘 스크립트를 시뮬레이션 할 수 있습니다 (사용 된 PID는 시작된 쉘이 아닌 C ++ 프로그램입니다).

대신 posix를 사용할 수 있습니다 popen() 기능; 당신은 '2>&1'명령 문자열에서 명령의 표준 오류를 표준 출력과 동일한 장소로 보내기 위해 작성했지만 임시 파일이 필요하지 않습니다.

FILE *pp = popen("program arg1 arg2 2>&1", "r");

그런 다음 파일 스트림을 읽을 수 있습니다. C 파일 스트림을 C ++ Istream에 매핑하는 깨끗한 방법이 있는지 확실하지 않습니다. 아마있을 것입니다.

다른 팁

hstdinput, hstdoutput 및 hstderror가있는 startup_info 구조를 작성해야합니다. CreateProcess시 손에 상속받는 것을 잊지 마십시오.

/* Assume you open a file handle or pipe called myoutput */
STARTUP_INFO si_startinfo;
ZeroMemory(&si_startinfo, sizeof(STARTUP_INFO));
si_startinfo.cb = sizeof(STARTUP_INFO);
si_startinfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si_startinfo.hStdOutput = myoutput;
si_startinfo.hStdError = myoutput;
si_startifno.dwFlags != STARTF_USEHANDLES;

PROCESS_INFORMATION pi_procinfo;
ZeroMemory(&pi_procinfo, sizeof(PROCESS_INFORMATION);

CreateProcess(NULL, cmdline, NULL, NULL, true, 0, NULL, pathname, &si_startinfo, &pi_procinfo);

오류 처리 측면을 보여주지 않았습니다. 다섯 번째 인수는 핸들을 물려 받기 위해 충실하게 설정됩니다. 다른 사람들은 파이프를 만드는 방법을 설명하여 여기서 반복하지 않을 것입니다.

Microsoft의 CRT와 MSDN 라이브러리에는 시스템 기능과 _popen 기능이 포함됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top