리눅스 popen 예제

표준 출력에 프롬프트를 작성하고 표준 입력에서 줄을 읽는 응용 프로그램을 고려합니다. popen을 사용하면 응용 프로그램과 입력 간에 프로그램을 삽입하여 입력을 변환할 수 있습니다. 그림 15.13은 프로세스의 배열을 나타낸다. popen() 함수는 파이프를 만들고, 포쳐를 만들고, 쉘을 호출하여 프로세스를 엽니다. 파이프는 정의단방향이므로 형식 인수는 읽기 또는 쓰기만 지정할 수 있으며 둘 다 지정하지는 않습니다. 결과 스트림은 그에 상응하는 읽기 전용 또는 쓰기 전용입니다. 출력 popen() 스트림은 기본적으로 완전히 버퍼링됩니다. 일반적인 작업은 출력을 읽거나 입력을 전송하기 위해 다른 프로세스에 파이프를 만드는 것이므로 표준 I/O 라이브러리는 역사적으로 popen 및 close 함수를 제공했습니다. 이 두 함수는 파이프 만들기, 자식 포크, 파이프의 사용되지 않는 끝 닫기, 명령을 실행하기 위해 셸 실행, 명령이 종료될 때까지 기다리는 등 우리가 수행한 모든 더러운 작업을 처리합니다. popen() 함수는 메모리 할당에 실패하면 errno를 설정하지 않습니다. 기본 포크(2) 또는 파이프(2)가 실패하면 errno가 적절하게 설정됩니다. 형식 인수가 잘못되어 이 조건이 검색되면 errno가 EINVAL로 설정됩니다. 나는 popen 함수를 사용하기 위해 여기에 스레드를 참조하는 아래 의 코드를 가지고 popen ()의 최종 데모, 통과 된 명령과 파일 이름 사이의 파이프 라인을 여는 제네릭 프로그램을 만들어 보자 : 우리는 실행 파일 myuclc에이 필터를 컴파일 , 다음 그림 15.15에서 popen을 사용 하 여 프로그램에서 호출 합니다.

응용 프로그램이 waitpid를 호출하고 popen에 의해 생성 된 자식의 종료 상태를 얻는 경우 응용 프로그램이 닫히기를 호출 할 때 waitpid를 호출하고 자식이 더 이상 존재하지 않는다는 것을 발견하고 errno가 ECHILD로 설정된 상태에서 1을 반환합니다. 이 경우 POSIX.1에서 요구하는 동작입니다. popen()에 의해 열린 스트림은 pclose()에 의해 닫아야 합니다. POSIX.1에서는 popen이 이전 호출에서 popen에 대한 자식에서 여전히 열려 있는 모든 스트림을 닫아야 합니다. 이렇게 하려면 자식의 childpid 배열을 살펴보고 여전히 열려 있는 설명기를 닫습니다. popen()의 동작은 r 및 w 모드값에 대해 지정됩니다. rb 및 wb와 같은 다른 모드는 특정 구현에서 지원될 수 있지만 이식 가능한 기능은 아닙니다. popen()의 기록 구현은 모드의 첫 번째 문자가 r인지 확인합니다. 따라서 로봇의 로버트 모드는 모드 r로 처리되고 다른 모드는 모드 w로 처리됩니다.