저는 C++로 애플리케이션을 작성하고 있습니다. 내 코드의 여러 위치에서 system()
함수를 사용하여 일부 명령을 실행합니다. 이것이 우아한 해결책인지 확신할 수 없으며 이 함수를 하위 프로세스를 호출하는 다른 방법으로 대체하고 싶습니다.
고려해야 할 두 가지 중요한 문제가 있습니다.
- 먼저 하위 프로세스 실행이 끝날 때까지 기다렸다가 반환 코드를 확인하고 싶습니다.
- 둘째, 때때로 이러한 명령은 터미널에 몇 가지 중요한 정보를 인쇄합니다. 이 정보를 읽고 저장하고 싶습니다
rsyslog
. 내 애플리케이션에서 일부 이벤트 로깅을 사용하고 있습니다syslog(LOG_INFO, "%s", "Some event occured.")
. 유사한 방식으로 하위 프로세스의 출력을 기록할 수 있습니까?
답변1
내 코드의 여러 위치에서
system()
함수를 사용하여 일부 명령을 실행합니다.
이것은 좋은 징조가 아닙니다! system
실제로 자주 사용해야 하는 것입니다. C++ 함수도 아니고, 시스템 호출도 아니고, 명령을 실행하기 위해 셸을 여는 C 라이브러리입니다(글쎄, 에 싸여 있지만 <cstdlib>
여전히).많은대부분의 경우 이는 오버헤드일 뿐만 아니라 프로그램에 보안 허점을 초래하는 일반적인 방법이기도 합니다. 그 동작은 매우 놀랍습니다. 여러분의 환경으로 인해 쉘이 흥미로운 방식으로 동작할 수도 있습니다.
그러니 system
당신이 아니라면 그것을 사용하지 마십시오진짜~ 고 싶어요
- /bin/sh 프로그램 찾기
- 달리다,
- 해당 매개변수(
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");