linux popen 예제

popen이 특히 적합한 한 가지는 실행 중인 명령의 입력 또는 출력을 변환하기 위해 간단한 필터를 실행하는 것입니다. 명령이 자체 파이프라인을 빌드하려는 경우와 마찬가지입니다. popen()에 의해 열린 스트림은 pclose()에 의해 닫아야 합니다. popen()에 대한 모드 인수는 I/O 모드를 지정하는 문자열입니다: popen에 대한 최종 인수를 기억하는 한 가지 방법은 펜처럼 형식이 “r” 이거나 형식이 “w”인 경우 반환된 파일 포인터를 읽을 수 있다는 것을 기억하는 것입니다. popen()으로 작성된 파이프는 close()로 닫아야 합니다. 지금까지 는 popen / pclose가 표준 파일 스트림 I / O 함수 fopen () 및 fclose ()과 눈에 띄는 유사성을 공유한다는 것을 깨달았을 것입니다. popen() 함수는 파이프를 만들고, 포쳐를 만들고, 쉘을 호출하여 프로세스를 엽니다. 파이프는 정의단방향이므로 형식 인수는 읽기 또는 쓰기만 지정할 수 있으며 둘 다 지정하지는 않습니다. 결과 스트림은 그에 상응하는 읽기 전용 또는 쓰기 전용입니다. 변환은 경로 이름 확장(예: 기록 메커니즘)(이전에 입력한 명령을 기억)을 제공할 수 있습니다. popen()은 쉘을 사용하여 입찰을 수행하므로 모든 쉘 확장 캐릭터와 메타 문자를 사용할 수 있습니다! 또한 리디렉션 및 출력 배관과 같은 고급 기술을 popen()과 함께 활용할 수 있습니다.

다음 샘플 호출을 고려합니다: popen을 사용하여 그림 15.6에서 프로그램을 다시 수행해 보겠습니다. 이는 도 15.11에 도시되어 있다. 응용 프로그램이 waitpid를 호출하고 popen에 의해 생성 된 자식의 종료 상태를 얻는 경우 응용 프로그램이 닫히기를 호출 할 때 waitpid를 호출하고 자식이 더 이상 존재하지 않는다는 것을 발견하고 errno가 ECHILD로 설정된 상태에서 1을 반환합니다. 이 경우 POSIX.1에서 요구하는 동작입니다. 모드가 r인 경우 자식 프로세스가 시작될 때 파일 설명자 STDOUT_FILENO는 파이프의 쓰기 가능한 끝이어야 하며, 스트림이 popen(popen)에 의해 반환되는 스트림 포인터인 호출 프로세스의 파일 설명자 fileno(stream)는 파이프를 참조하십시오. POSIX.1에서는 popen이 이전 호출에서 popen에 대한 자식에서 여전히 열려 있는 모든 스트림을 닫아야 합니다. 이렇게 하려면 자식의 childpid 배열을 살펴보고 여전히 열려 있는 설명기를 닫습니다. popen() 후, 부모와 자식 프로세스는 둘 중 하나가 종료되기 전에 독립적으로 실행될 수 있어야 합니다. 함수 popen은 cmdstring을 실행하기 위해 포크와 exec을 수행하고 표준 I/O 파일 포인터를 반환합니다. 형식이 “r”이면 파일 포인터가 cmdstring의 표준 출력에 연결됩니다(그림 15.9). 즉, 쉘은 cmdstring에서 특수 문자를 확장합니다. 예를 들어 응용 프로그램이 0보다 큰 pid 인수를 사용하여 waitpid() 또는 waitid()를 호출하고 popen() open으로 호출된 스트림이 여전히 있는 경우 pid가 popen()에 의해 시작된 프로세스를 참조하지 않도록 해야 합니다.

일반적인 작업은 출력을 읽거나 입력을 전송하기 위해 다른 프로세스에 파이프를 만드는 것이므로 표준 I/O 라이브러리는 역사적으로 popen 및 close 함수를 제공했습니다. 이 두 함수는 파이프 만들기, 자식 포크, 파이프의 사용되지 않는 끝 닫기, 명령을 실행하기 위해 셸 실행, 명령이 종료될 때까지 기다리는 등 우리가 수행한 모든 더러운 작업을 처리합니다.