reproc(리디렉션 프로세스)는 외부 프로그램의 시작, 중지 및 통신을 단순화하는 크로스 플랫폼 C/C++ 라이브러리입니다. 주요 사용 사례는 C 또는 C++ 코드에서 직접 명령줄 애플리케이션을 실행하고 해당 출력을 검색하는 것입니다.
reproc은 reproc과 reproc++라는 두 개의 라이브러리로 구성됩니다. reproc은 외부 프로그램 작업을 위한 실제 코드가 포함된 C99 라이브러리입니다. reproc++는 reproc에 의존하며 해당 API를 관용적인 C++11 API에 적용합니다. 또한 C++의 외부 프로그램 작업을 단순화하는 몇 가지 추가 기능도 추가합니다.
#include <reproc/run.h>
int main ( void )
{
const char * args [] = { "echo" , "Hello, world!" , NULL };
return reproc_run ( args , ( reproc_options ) { 0 });
}
추가 정보와 설명서를 읽은 후 질문이 있는 경우 문제를 제기하거나 reproc gitter 채널에서 직접 질문할 수 있습니다.
참고: 재현을 구축하려면 CMake 3.12 이상이 필요합니다.
프로젝트에 재현하는 방법에는 여러 가지가 있습니다. 한 가지 방법은 CMake를 사용하여 프로젝트의 일부로 reproc을 빌드하는 것입니다. 이를 위해서는 먼저 재현 소스 코드를 프로젝트에 가져와야 합니다. 다음 옵션 중 하나를 사용하여 이 작업을 수행할 수 있습니다.
FetchContent
API를 사용하여 재현을 다운로드할 수 있습니다. 예제는 https://cliutils.gitlab.io/modern-cmake/chapters/projects/fetch.html을 참조하세요.프로젝트에 reproc의 소스 코드를 포함시킨 후 다음과 같이 루트 CMakeLists.txt 파일에서 빌드할 수 있습니다.
add_subdirectory (< path -to-reproc>) # For example: add_subdirectory(external/reproc)
add_subdirectory
호출하기 전에 CMake 옵션을 지정할 수 있습니다.
set (REPROC++ ON )
add_subdirectory (< path -to-reproc>)
참고: 이전 CMake 실행에서 옵션이 이미 캐시된 경우 새 기본값을 적용하려면 CMake의 캐시를 지워야 합니다.
복제 빌드 구성에 대한 자세한 내용은 CMake 옵션을 참조하세요.
설치된 reproc 버전에 따라 달라질 수도 있습니다. reproc을 직접 빌드하고 설치하거나 패키지 관리자를 통해 reproc을 설치할 수 있습니다. reproc은 다음 패키지 저장소에서 사용할 수 있습니다.
패키지 관리자를 사용할 수 없는 경우 소스(CMake 3.13+)에서 reproc을 빌드하고 설치할 수 있습니다.
cmake -B build
cmake --build build
cmake --install build
REPROC_TEST
옵션을 활성화하고 test
대상을 빌드하여 테스트를 실행합니다(CMake 3.13+).
cmake -B build -DREPROC_TEST=ON
cmake --build build
cmake --build build --target test
reproc을 설치한 후 빌드 시스템에서 이를 찾아야 합니다. reproc은 각각 CMake 및 pkg-config를 사용하여 reproc 설치를 쉽게 찾을 수 있도록 CMake 구성 파일과 pkg-config 파일을 모두 제공합니다. reproc과 reproc++는 별도의 라이브러리이므로 별도의 구성 파일도 있습니다. 사용하고 싶은 것을 꼭 검색해 보세요.
CMake를 사용하여 설치된 reproc 버전을 찾으려면 다음 안내를 따르세요.
find_package (reproc) # Find reproc.
find_package (reproc++) # Find reproc++.
프로젝트의 일부로 reproc을 빌드하거나 설치된 reproc 버전을 찾은 후 다음과 같이 CMakeLists.txt 파일 내에서 이에 대해 연결할 수 있습니다.
target_link_libraries (myapp reproc) # Link against reproc.
target_link_libraries (myapp reproc++) # Link against reproc++.
Meson 0.53.2부터 reproc는 Meson 빌드 스크립트의 CMake 하위 프로젝트로 포함될 수 있습니다. 자세한 내용은 https://mesonbuild.com/CMake-module.html을 참조하세요.
기본적으로 reproc에는 POSIX 시스템의 pthread( -pthread
)에 대한 종속성과 Windows 시스템의 Winsock 2.2( -lws2_32
)에 대한 종속성이 있습니다. CMake와 pkg-config는 이러한 종속성을 자동으로 처리합니다.
reproc의 빌드는 다음 CMake 옵션을 사용하여 구성할 수 있습니다.
REPROC++
: reproc++ 빌드 (기본값: ${REPROC_DEVELOP}
)
REPROC_TEST
: 빌드 테스트 (기본값: ${REPROC_DEVELOP}
)
reproc을 빌드한 후 빌드 디렉터리에서 찾을 수 있는 test
바이너리를 실행하여 테스트를 실행합니다.
REPROC_EXAMPLES
: 빌드 예시 (기본값: ${REPROC_DEVELOP}
)
결과 바이너리는 reproc을 빌드한 후 빌드 디렉터리에 있는 각 프로젝트 하위 디렉터리의 예제 폴더에 위치합니다.
REPROC_OBJECT_LIBRARIES
: CMake 개체 라이브러리 빌드(기본값: ${REPROC_DEVELOP}
)
이는 다른 라이브러리에 reproc을 직접 포함하는 데 유용합니다. reproc을 정적 또는 공유 라이브러리로 빌드하는 경우 소비 라이브러리와 함께 설치해야 하므로 소비 라이브러리 배포가 더 어려워집니다. 개체 라이브러리를 사용할 때 reproc의 개체 파일은 소비 라이브러리에 직접 포함되며 추가 설치가 필요하지 않습니다.
참고: reproc의 개체 라이브러리는 CMake 3.14 이상에서만 올바르게 연결됩니다.
참고: 이 옵션은 BUILD_SHARED_LIBS
보다 우선 적용됩니다.
REPROC_INSTALL
: 설치 규칙 생성(기본값: REPROC_OBJECT_LIBRARIES
활성화되지 않은 경우 ON
)
REPROC_INSTALL_CMAKECONFIGDIR
: CMake 구성 파일 설치 디렉터리(기본값: ${CMAKE_INSTALL_LIBDIR}/cmake
)
REPROC_INSTALL_PKGCONFIG
: pkg-config 파일 설치 (기본값: ON
)
REPROC_INSTALL_PKGCONFIGDIR
: pkg-config 파일 설치 디렉터리 (기본값: ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)
REPROC_MULTITHREADED
: pthread_sigmask
사용하고 시스템의 스레드 라이브러리에 대해 연결합니다(기본값: ON
).
REPROC_DEVELOP
: 개발을 위한 옵션 기본값 구성(기본값: REPROC_DEVELOP
환경 변수가 설정되지 않은 경우 OFF
)REPROC_SANITIZERS
: 새니타이저로 빌드 (기본값: ${REPROC_DEVELOP}
)REPROC_TIDY
: 빌드 시 clang-tidy 실행 (기본값: ${REPROC_DEVELOP}
)REPROC_WARNINGS
: 컴파일러 경고 활성화 (기본값: ${REPROC_DEVELOP}
)REPROC_WARNINGS_AS_ERRORS
: 컴파일 플래그 및 clang-tidy에 -Werror 또는 이에 상응하는 항목을 추가합니다(기본값: OFF
). 각 함수와 클래스는 헤더 파일에 광범위하게 문서화되어 있습니다. 예제는 reproc 및 reproc++의 예제 하위 디렉터리에서 찾을 수 있습니다.
실패 시 reproc API의 대부분 함수는 음수 errno
(POSIX) 또는 GetLastError
(Windows) 스타일 오류 코드를 반환합니다. 조치 가능한 오류의 경우 reproc는 플랫폼별 코드를 작성하지 않고도 오류와 일치시키는 데 사용할 수 있는 상수( REPROC_ETIMEDOUT
, REPROC_EPIPE
, ...)를 제공합니다. 오류의 문자열 표현을 얻으려면 이를 reproc_strerror
에 전달하세요.
reproc++의 API는 C++ 표준 라이브러리 오류 코드 메커니즘( std::error_code
및 std::error_condition
)과 통합됩니다. reproc++ API의 대부분 메서드는 발생한 실제 시스템 오류가 포함된 std::error_code
값을 반환합니다. std::errc
열거형의 값을 사용하여 이러한 오류 코드를 테스트할 수 있습니다.
reproc을 사용할 때 오류를 처리하는 방법에 대한 자세한 내용은 예제를 참조하세요.
메모:
reproc 및 reproc++ API는 모두 terminate
또는 kill
와 같은 하나 이상의 stop
작업을 정의할 수 있는 options
인수를 사용합니다. 따라서 POSIX의 신호를 사용하여 하위 프로세스가 종료되거나 종료되는 경우 오류 코드는 오류를 반영 하지 않습니다 .
오류 코드와 함께 예상치 못한 동작을 반영하는 상태 코드를 해석하는 것은 다운스트림 프로젝트에 달려 있습니다(이 예 참조).
동시에 둘 이상의 스레드에서 동일한 하위 프로세스에 대해 동일한 작업을 호출하지 마십시오. 예를 들어, 서로 다른 스레드에서 하위 프로세스를 읽고 쓰는 것은 괜찮지만 동시에 두 개의 서로 다른 스레드에서 동일한 하위 프로세스를 기다리면 문제가 발생합니다.
(POSIX) reproc에 의해 시작된 프로세스의 pid에 대해 waitpid
호출하지 않는 것이 좋습니다.
reproc은 waitpid
사용하여 프로세스가 종료될 때까지 기다립니다. 안타깝게도 동일한 프로세스에서 waitpid
두 번 호출할 수 없습니다. 이는 reproc 외부에서 미리 하위 프로세스에서 waitpid
이미 호출된 경우 reproc_wait
올바르게 작동하지 않음을 의미합니다.
reproc_wait
또는 reproc_stop
사용하여 각 하위 프로세스가 실제로 종료되는지 확인하는 것이 좋습니다.
POSIX에서 종료된 하위 프로세스는 상위 프로세스가 waitpid
사용하여 기다릴 때까지 좀비 프로세스입니다. 좀비 프로세스는 리소스를 차지하며 리소스 누수로 간주될 수 있으므로 모든 프로세스가 적시에 올바르게 종료되도록 하는 것이 중요합니다.
reproc_kill
사용하기 전에 종료될 때까지 기다리거나 reproc_terminate
호출하여 하위 프로세스를 종료해 보는 것이 좋습니다.
reproc_kill
사용할 때 하위 프로세스는 정리를 수행할 기회를 받지 못하며 이로 인해 리소스가 누출될 수 있습니다. 이러한 유출 중 가장 중요한 것은 자식 프로세스가 자신의 자식 프로세스를 중지할 수 없다는 것입니다. reproc_kill
호출하기 전에 항상 reproc_terminate
호출하여 하위 프로세스가 정상적으로 종료되도록 하십시오. reproc_stop
은 시간 초과가 있는 여러 중지 작업을 연속적으로 수행하는 데 사용할 수 있는 편리한 도우미 함수입니다.
(POSIX) 상위 프로세스에서는 SIGPIPE
신호를 무시하는 것이 좋습니다.
POSIX에서 하위 프로세스의 닫힌 stdin 파이프에 쓰면 기본적으로 SIGPIPE
신호로 상위 프로세스가 종료됩니다. 이를 방지하려면 상위 프로세스에서 SIGPIPE
신호를 무시해야 합니다. SIGPIPE
신호가 무시되면 reproc_write
닫힌 stdin 파이프에 쓸 때 예상대로 REPROC_EPIPE
반환합니다.
reproc_terminate
사용하면 하위 프로세스가 정리를 수행할 수 있지만 자체적으로 올바르게 정리하는 것은 하위 프로세스에 달려 있습니다. reproc은 자식 프로세스에만 종료 신호를 보냅니다. 자식 프로세스 자체는 자신의 자식 프로세스와 기타 리소스를 정리하는 일을 담당합니다.
(Windows) reproc_kill
Windows에서 하위 프로세스를 즉시 종료한다고 보장하지 않습니다. 자세한 내용은 reproc이 Windows에서 하위 프로세스를 종료하는 데 사용하는 Windows TerminateProcess
함수 설명서의 설명 섹션을 참조하세요.
reproc을 통해 생성된 하위 프로세스는 하위 프로세스가 종료될 때까지 기다리는 데 사용되는 단일 추가 파일 핸들을 상속합니다. 하위 프로세스가 이 파일 핸들을 수동으로 닫으면 reproc은 하위 프로세스가 종료되었음을 잘못 감지합니다. 이 핸들이 하위 프로세스보다 오래 지속되는 다른 프로세스에 의해 추가로 상속되는 경우 reproc는 하위 프로세스가 종료된 경우에도 여전히 실행 중임을 감지합니다. 데이터가 이 핸들에 기록되면 reproc은 하위 프로세스가 종료되었음을 잘못 감지합니다.
(Windows) 하위 프로세스가 종료되기 전에 stdout 또는 stderr 스트림을 닫는지 여부를 감지할 수 없습니다. 상위 프로세스는 하위 프로세스가 종료된 후에 하위 프로세스 출력 스트림이 닫혔다는 알림만 받습니다.
(Windows) reproc에서는 Windows가 파일 시스템 개체로 사용할 수 있는 소켓을 생성한다고 가정합니다. 보다 구체적으로 WSASocket
에서 반환된 기본 소켓에는 XP1_IFS_HANDLES
플래그가 설정되어 있어야 합니다. Windows 시스템에 외부 LSP 공급자가 설치되어 있는 경우에는 그렇지 않을 수 있습니다. 이 경우 추가 서비스 공급자를 제공하는 소프트웨어는 더 이상 사용되지 않으므로 제거하는 것이 좋습니다(https://docs.microsoft.com/en-us/windows/win32/winsock/ 참조). 계층화된 서비스 제공자 및 애플리케이션 분류).