리눅스 popen 예제

popen이 특히 적합한 한 가지는 실행 중인 명령의 입력 또는 출력을 변환하기 위해 간단한 필터를 실행하는 것입니다. 명령이 자체 파이프라인을 빌드하려는 경우와 마찬가지입니다. popen() 함수는 메모리 할당에 실패하면 errno를 설정하지 않습니다. 기본 포크(2) 또는 파이프(2)가 실패하면 errno가 적절하게 설정됩니다. 형식 인수가 잘못되어 이 조건이 검색되면 errno가 EINVAL로 설정됩니다. 정렬 명령에 파이프를 열고 문자열 배열을 정렬하는 이 예제를 고려하십시오. 모드가 r인 경우 자식 프로세스가 시작될 때 파일 설명자 STDOUT_FILENO는 파이프의 쓰기 가능한 끝이어야 하며, 스트림이 popen(popen)에 의해 반환되는 스트림 포인터인 호출 프로세스의 파일 설명자 fileno(stream)는 파이프를 참조하십시오. 변환은 경로 이름 확장(예: 기록 메커니즘)(이전에 입력한 명령을 기억)을 제공할 수 있습니다. popen(popen)의 또 다른 예로, 두 개의 파이프를 여는 이 작은 프로그램을 고려하십시오(하나는 ls 명령, 다른 하나는 정렬함): popen()의 반환 값은 모든 면에서 일반적인 표준 I/O 스트림으로, fclose(3)이 아닌 pclose(3)으로 닫아야 한다는 것을 저장합니다. 이러한 스트림에 쓰는 것은 명령의 표준 입력에 기록; 명령의 표준 출력은 명령 자체에 의해 변경되지 않는 한 popen()이라고 하는 프로세스의 출력과 동일합니다. 반대로 „popened” 스트림에서 읽는 것은 명령의 표준 출력을 읽으며 명령의 표준 입력은 popen()이라고 하는 프로세스의 입력과 동일합니다.

그림 15.12는 우리의 판면 및 닫기 버전을 보여줍니다. popen() 후, 부모와 자식 프로세스는 둘 중 하나가 종료되기 전에 독립적으로 실행될 수 있어야 합니다. 일반적인 작업은 출력을 읽거나 입력을 전송하기 위해 다른 프로세스에 파이프를 만드는 것이므로 표준 I/O 라이브러리는 역사적으로 popen 및 close 함수를 제공했습니다. 이 두 함수는 파이프 만들기, 자식 포크, 파이프의 사용되지 않는 끝 닫기, 명령을 실행하기 위해 셸 실행, 명령이 종료될 때까지 기다리는 등 우리가 수행한 모든 더러운 작업을 처리합니다. 원본 및 popen()ed 프로세스가 공통 파일을 읽거나 쓰거나 읽고 쓰려는 경우 FILE 형식 C 함수(fread(), fwrite() 등을 사용하는 경우 파일 핸들 공유 규칙을 준수해야 합니다(파일 설명자의 상호 작용 참조) 및 표준 I/O 스트림)을 제공합니다. 응용 프로그램이 0보다 큰 pid 인수를 사용하여 waitpid() 또는 waitid()를 호출하고 popen() open으로 호출된 스트림이 여전히 있는 경우 pid가 popen()에 의해 시작된 프로세스를 참조하지 않도록 해야 합니다. 그림 15.6에서 popen을 사용하여 프로그램을 다시 수행해 보겠습니다. 이는 도 15.11에 도시되어 있다. IEEE Std 1003.1-2001/Cor 2-2004, 항목 XSH/TC2/D6/67이 적용되어 예제 섹션에 예제를 추가합니다. 이 필터를 실행 파일 myuclc로 컴파일한 다음 popen을 사용하여 그림 15.15의 프로그램에서 호출합니다.

표준 출력에 프롬프트를 작성하고 표준 입력에서 줄을 읽는 응용 프로그램을 고려합니다. popen을 사용하면 응용 프로그램과 입력 간에 프로그램을 삽입하여 입력을 변환할 수 있습니다. 그림 15.13은 프로세스의 배열을 나타낸다. popen()의 동작은 r 및 w 모드값에 대해 지정됩니다. rb 및 wb와 같은 다른 모드는 특정 구현에서 지원될 수 있지만 이식 가능한 기능은 아닙니다. popen()의 기록 구현은 모드의 첫 번째 문자가 r인지 확인합니다. 따라서 로봇의 로버트 모드는 모드 r로 처리되고 다른 모드는 모드 w로 처리됩니다. popen() 함수는 파이프를 만들고, 포쳐를 만들고, 쉘을 호출하여 프로세스를 엽니다. 파이프는 정의단방향이므로 형식 인수는 읽기 또는 쓰기만 지정할 수 있으며 둘 다 지정하지는 않습니다. 결과 스트림은 그에 상응하는 읽기 전용 또는 쓰기 전용입니다.