MPR | c++ popen 예제
155681
single,single-post,postid-155681,single-format-standard,ajax_fade,page_not_loaded,,select-theme-ver-3.2.1,popup-menu-slide-from-left,wpb-js-composer js-comp-ver-4.12,vc_responsive
 

c++ popen 예제

c++ popen 예제

popen()으로 작성된 파이프는 close()로 닫아야 합니다. 지금까지 는 popen / pclose가 표준 파일 스트림 I / O 함수 fopen () 및 fclose ()과 눈에 띄는 유사성을 공유한다는 것을 깨달았을 것입니다. _popen 함수는 파이프를 만들고 지정된 문자열 명령을 사용 하 여 명령 프로세서의 생성 된 복사본을 비동기적으로 실행 합니다. 문자열 모드는 다음과 같이 요청된 액세스 유형을 지정합니다. popen()의 동작은 r 및 w 모드값에 대해 지정됩니다. rb 및 wb와 같은 다른 모드는 특정 구현에서 지원될 수 있지만 이식 가능한 기능은 아닙니다. popen()의 기록 구현은 모드의 첫 번째 문자가 r인지 확인합니다. 따라서 로봇의 로버트 모드는 모드 r로 처리되고 다른 모드는 모드 w로 처리됩니다. popen()에 대한 모드 인수는 I/O 모드를 지정하는 문자열입니다: 실행된 명령의 환경은 fork() 함수를 사용하여 popen() 호출 내에서 자식 프로세스가 생성된 것처럼 해야 하며, 자식이 호출을 사용하여 sh 유틸리티를 호출한 경우입니다. : popen() 함수는 사용자(또는 그룹) ID 권한을 설정한 프로그램에서 사용해서는 안 됩니다. 기능의 포크() 및 exec 패밀리(execlp() 및 execvp()를 제외한)를 대신 사용해야 합니다. 이렇게 하면 호출 프로그램에서 예상하지 못한 명령 실행을 유발할 수 있는 사용자 환경의 예기치 않은 조작을 방지할 수 있습니다. popen()의 또 다른 예로, 두 개의 파이프(ls 명령에 하나, 정렬할 파이프)를 여는 이 작은 프로그램을 고려하십시오.

popen() 함수는 파이프를 만들고, 포쳐를 만들고, 쉘을 호출하여 프로세스를 엽니다. 버퍼를 사용하여 stdout의 내용을 읽고 결과 문자열에 계속 추가할 수 있으며 프로세스가 종료될 때 이 문자열을 반환할 수 있습니다. 예를 들어, popen()의 최종 데모를 위해 전달된 명령과 파일 이름 사이에 파이프라인을 여는 일반 프로그램을 만들어 보겠습니다. FILE 형식 C 함수(fread(), fwrite() 등을 사용하여 파일 핸들 공유 규칙을 준수해야 합니다(파일 설명자 및 표준 I/O 스트림의 상호 작용 참조). _wpopen은 _popen의 와이드 문자 버전입니다. _wpopen에 대한 경로 인수는 와이드 문자 문자열입니다. _wpopen 및 _popen 그렇지 않으면 동일하게 작동합니다. 관련 POSIX 함수 popen을 사용하면 호출자에게 명령에 의해 생성된 출력을 사용할 수 있습니다. popen()은 쉘을 사용하여 입찰을 수행하므로 모든 쉘 확장 캐릭터와 메타 문자를 사용할 수 있습니다! 또한 리디렉션 및 출력 배관과 같은 고급 기술을 popen()과 함께 활용할 수 있습니다. 다음 샘플 호출을 고려하십시오: 모드가 r인 경우, 자식 프로세스가 시작될 때 파일 설명자 STDOUT_FILENO는 파이프의 쓰기 가능한 끝이어야 하며, 호출 프로세스에서 파일 설명자 fileno(stream)가 스트림포인터가 반환되는 경우 popen() 파이프의 가독성 이음새가 있어야 합니다.

다음 예제에서는 현재 디렉토리에서 파일 목록을 얻기 위해 popen() 및 pclose()를 사용하여 명령 ls *를 실행하는 방법을 보여 줍니다. 호출 프로그램과 실행된 명령 사이에 파이프를 만들고 파이프에서 읽거나 쓰는 데 사용할 수 있는 스트림에 대한 포인터를 반환해야 합니다. 입력 필터를 열기 전에 버퍼링된 판독값은 해당 필터의 표준 입력이 잘못 배치될 수 있습니다. 출력 필터와 유사한 문제는 신중한 버퍼 플러싱으로 방지할 수 있습니다. 예를 들어 fflush()를 사용합니다. popen() 함수는 또한 fork() 또는 파이프()에 의해 설명된 대로 errno 값을 설정할 수도 있다. 응용 프로그램이 0보다 큰 pid 인수를 사용하여 waitpid() 또는 waitid()를 호출하고 popen() open으로 호출된 스트림이 여전히 있는 경우 pid가 popen()에 의해 시작된 프로세스를 참조하지 않도록 해야 합니다.

No Comments

Sorry, the comment form is closed at this time.