호출된 명령의 출력을 얻으려는 경우 C++에서 하위 프로세스를 실행하는 가장 좋은 방법

호출된 명령의 출력을 얻으려는 경우 C++에서 하위 프로세스를 실행하는 가장 좋은 방법

저는 C++로 애플리케이션을 작성하고 있습니다. 내 코드의 여러 위치에서 system()함수를 사용하여 일부 명령을 실행합니다. 이것이 우아한 해결책인지 확신할 수 없으며 이 함수를 하위 프로세스를 호출하는 다른 방법으로 대체하고 싶습니다.

고려해야 할 두 가지 중요한 문제가 있습니다.

  1. 먼저 하위 프로세스 실행이 끝날 때까지 기다렸다가 반환 코드를 확인하고 싶습니다.
  2. 둘째, 때때로 이러한 명령은 터미널에 몇 가지 중요한 정보를 인쇄합니다. 이 정보를 읽고 저장하고 싶습니다 rsyslog. 내 애플리케이션에서 일부 이벤트 로깅을 사용하고 있습니다 syslog(LOG_INFO, "%s", "Some event occured."). 유사한 방식으로 하위 프로세스의 출력을 기록할 수 있습니까?

답변1

내 코드의 여러 위치에서 system()함수를 사용하여 일부 명령을 실행합니다.

이것은 좋은 징조가 아닙니다! system실제로 자주 사용해야 하는 것입니다. C++ 함수도 아니고, 시스템 호출도 아니고, 명령을 실행하기 위해 셸을 여는 C 라이브러리입니다(글쎄, 에 싸여 있지만 <cstdlib>여전히).많은대부분의 경우 이는 오버헤드일 뿐만 아니라 프로그램에 보안 허점을 초래하는 일반적인 방법이기도 합니다. 그 동작은 매우 놀랍습니다. 여러분의 환경으로 인해 쉘이 흥미로운 방식으로 동작할 수도 있습니다.

그러니 system당신이 아니라면 그것을 사용하지 마십시오진짜~ 고 싶어요

  1. /bin/sh 프로그램 찾기
  2. 달리다,
  3. 해당 매개변수( argv)를 다음으로 설정합니다.-c what you passed to system()

포인트 3은 다른 실행 파일뿐만 아니라 다른 실행 파일을 실행하는 경우에만 의미가 있습니다.쉘 명령, 즉 먼저 프로그램에 논리적으로 통합될 수 있는 것입니다.

이것이 우아한 해결책인지 확신할 수 없으며 이 함수를 하위 프로세스를 호출하는 다른 방법으로 대체하고 싶습니다.

물론 여러 가지 방법이 있으며 실제로 해야 할 일은 전화 내용, 이유, 빈도에 따라 다릅니다.

먼저 하위 프로세스 실행이 끝날 때까지 기다렸다가 반환 코드를 확인하고 싶습니다.

system그건 그렇고, 를 사용하여 이 작업을 수행할 수도 있습니다 WEXITSTATUS. 자세한 내용은 을 참조하십시오 man 2 waitpid. 어쨌든 위에서 언급했듯이 사용을 권장하지 않습니다 system.

때때로 이러한 명령은 터미널에 몇 가지 중요한 정보를 인쇄합니다. rsyslog가 이 정보를 읽고 저장할 수 있기를 바랍니다.

당연하다고 말할 수는 없지만 이러한 명령이 자체적으로 기록되어야 할까요?

어쨌든 생성된 프로세스의 출력을 캡처하려면 libc/posix 를 사용하십시오 popen.

다시 한 번 말씀드리지만, 외부 명령을 호출하여 수행 중인 작업이 기존 라이브러리에서 수행될 수 있는지 여부에 대한 질문을 조사하여 OS에 요청하여 약간 어색한 우회를 할 필요가 없도록 강력히 권장합니다. 다른 프로세스를 실행하고 통신합니다.

답변2

C++ 케이스는 확인할 수 없었지만 @Marcus는 이것이 popen()가능하다고 답변했습니다. 그러면 애플리케이션에 호출된 명령의 내용을 FILE *읽을 수 있는 개체 가 제공됩니다.stdout

logger표준 입력을 시스템 로그로 보내는 독립 실행형 명령도 있습니다 .

애플리케이션의 표준 오류를 로거 파이프로 리디렉션할 수 있도록 popen호출하여 명령줄을 실행 합니다 . /bin/sh이는 Bash 프로세스 교체를 사용하려면 명령을 래핑해야 함을 의미할 수 있습니다. 따라서 popen 명령은 다음과 같습니다(테스트되지 않음).

fp = popen ("bash -c 'myApp myArgs 2>( logger -opts )'", "r");

관련 정보