귀하의 질문은 숲 답변을 요구하는 것처럼 보였으며 여기의 답변은 나무 답변처럼 보입니다. 그래서 나는 당신에게 숲 답변을 줄 것이라고 생각했습니다.
이것은 C 프로그램이 작성되는 방법은 매우 드 rare니다. 항상 셸 스크립트가 작성되는 방식이며 때로는 Python, perl 또는 Ruby 프로그램이 작성되는 방식입니다.
사람들은 일반적으로 시스템 라이브러리를 쉽게 사용하고 OS 시스템 호출에 대한 낮은 수준의 액세스 및 속도를 위해 C로 작성합니다. C는 작성하기 어려운 언어이므로 사람들이 그러한 것을 필요로하지 않으면 C를 사용하지 않습니다. 또한 C 프로그램은 일반적으로 공유 라이브러리 및 구성 파일에만 의존해야합니다.
하위 프로세스로의 셸링은 특히 빠르지 않으며 하위 수준의 시스템 기능에 대한 세밀하고 제어 된 액세스가 필요하지 않으며 외부 실행 파일에 대한 놀라운 의존성을 유발하므로 드물게 볼 수 있습니다. C 프로그램에서.
추가적인 우려가 있습니다. 사람들이 언급 한 보안 및 이식성 문제는 완전히 유효합니다. 그것들은 물론 쉘 스크립트에도 똑같이 유효하지만 사람들은 쉘 스크립트에서 이러한 종류의 문제를 기대하고 있습니다. 그러나 C 프로그램은 일반적으로 이러한 종류의 보안 문제를 예상하지 않으므로 더 위험합니다.
그러나 제 생각에는 가장 큰 관심사는 popen
프로그램의 나머지 부분과 상호 작용 하는 방식과 관련이 있습니다. popen
하위 프로세스를 작성하고 출력을 읽고 종료 상태를 수집해야합니다. 그 동안 해당 프로세스의 stderr은 프로그램과 동일한 stderr에 연결되어 혼란스러운 결과를 초래할 수 있으며 stdin은 프로그램과 동일하므로 다른 흥미로운 문제가 발생할 수 있습니다. 쉘이 해석 </dev/null 2>/dev/null
하기 popen
때문에 전달한 문자열을 포함 시켜서 해결할 수 있습니다 .
그리고 popen
자식 프로세스를 만듭니다. 신호 처리 또는 포크 프로세스와 관련된 작업을 수행하면 이상한 SIGCHLD
신호 가 발생할 수 있습니다 . 귀하의 전화가 wait
이상하게 상호 작용 popen
하고 이상한 경주 조건을 만들 수 있습니다.
보안 및 이식성 문제는 물론 존재합니다. 쉘 스크립트 또는 시스템에서 다른 실행 파일을 시작하는 모든 것입니다. 그리고 당신은 당신의 프로그램을 사용하는 사람들은 당신이에 전달하는 문자열에 쉘 메타 charcaters를 얻을 수없는 것을 조심해야 popen
하는 문자열에 주어진 때문에 sh
와 sh -c <string from popen as a single argument>
.
그러나 나는 그들이 C 프로그램을 사용하는 것이 이상한 이유라고 생각하지 않습니다 popen
. 이상한 이유는 C가 일반적으로 저수준 언어이고 저수준이 아니기 때문 popen
입니다. 그리고 popen
프로그램 의 장소 디자인 제약 조건을 사용 하면 프로그램의 표준 입력 및 출력과 이상하게 상호 작용하고 자체 프로세스 관리 또는 신호 처리를 수행하는 데 어려움이 있기 때문에 프로그램에 배치 디자인 제약 조건이 사용 되기 때문입니다. 그리고 C 프로그램은 일반적으로 외부 실행 파일에 의존하지 않을 것으로 예상됩니다.