[IPC 통신] 파이프 기반 popen 과 pclose 함수

4043 단어
표준 I/O 함수 라 이브 러 리 는 popen 함 수 를 제공 합 니 다. 다른 프로 세 스 를 시작 하여 셸 명령 행 을 실행 합 니 다.
popen 을 호출 하 는 프로 세 스 를 부모 프로 세 스 라 고 합 니 다. popen 에서 시작 하 는 프로 세 스 를 하위 프로 세 스 라 고 합 니 다.
popen 함 수 는 부자 프로 세 스 간 통신 에 도 파 이 프 를 만 듭 니 다.하위 프로 세 스 는 파이프 에서 정 보 를 읽 거나 파이프 에 정 보 를 쓰 거나 읽 거나 쓰 는 것 은 부모 프로 세 스 가 popen 을 호출 할 때 전달 하 는 매개 변수 에 달 려 있 습 니 다.popen, pclose 의 정 의 를 내 립 니 다:
#include <stdio.h>
/*
    :popen()   fork()     ,         /bin/sh -c     command   。
          type   “r”    ,“w”    。
           type ,popen()                        ,          。
                                                
   :          ,    NULL,      errno 
*/
FILE * popen( const char * command,const char * type);

/*
    :pclose()     popen           。  stream    popen()        
   :     shell     (          ),     -1,      errno 
*/
int pclose(FILE * stream);

다음은 예 를 들 어 popen 의 사용 을 살 펴 보 겠 습 니 다.
현재 디 렉 터 리 에 있 는 파일 개 수 를 얻 으 려 면 셸 에서 사용 할 수 있 습 니 다.
ls | wc -l

우 리 는 프로그램 에서 이렇게 쓸 수 있다.
/*            */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>

#define MAXLINE 1024

int main()
{
	char result_buf[MAXLINE], command[MAXLINE];
	int rc = 0; //          
	FILE *fp;

	/*         buf*/
	snprintf(command, sizeof(command), "ls ./ | wc -l");

	/*         ,           */
	fp = popen(command, "r");
	if(NULL == fp)
	{
		perror("popen    !");
		exit(1);
	}
	while(fgets(result_buf, sizeof(result_buf), fp) != NULL)
	{
		/*         ,           */
		if('
' == result_buf[strlen(result_buf)-1]) { result_buf[strlen(result_buf)-1] = '\0'; } printf(" 【%s】 【%s】\r
", command, result_buf); } /* */ rc = pclose(fp); if(-1 == rc) { perror(" "); exit(1); } else { printf(" 【%s】 【%d】 【%d】\r
", command, rc, WEXITSTATUS(rc)); } return 0; }

컴 파일 및 실행:
$ gcc popen.c
$ ./a.out
명령 [ls./| wc - l] 출력 [2]
명령 [ls./| wc - l] 하위 프로 세 스 종료 상태 [0] 명령 반환 값 [0]
위의 popen 은 command 의 표준 출력 만 캡 처 했 습 니 다. command 실행 에 실패 하면 하위 프로 세 스 는 잘못된 정 보 를 표준 오류 출력 으로 인쇄 합 니 다. 부모 프로 세 스 는 가 져 올 수 없습니다.예 를 들 어 command 명령 은 'ls nofile. txt' 입 니 다. 사실 우 리 는 nofile. txt 라 는 파일 이 없습니다. 이때 셸 은 'ls: nofile. txt: No such file or directory' 를 출력 합 니 다.이 출력 은 표준 오류 출력 에 있 습 니 다.위의 프로그램 을 통 해 가 져 올 수 없습니다.
주: 위 프로그램의 command 를 "ls nofile. txt"로 설정 하면 다음 과 같은 결 과 를 볼 수 있 습 니 다.
$ gcc popen.c 
$ ./a.out
ls: nofile.txt: No such file or directory
명령 [ls nofile. txt] 하위 프로 세 스 종료 상태 [256] 명령 반환 값 [1]
 주의해 야 할 것 은 첫 번 째 줄 의 출력 은 부모 프로 세 스 의 출력 이 아니 라 하위 프로 세 스 의 표준 오류 출력 입 니 다.
때때로 하위 프로 세 스 의 오류 정 보 는 매우 유용 합 니 다. 그러면 부모 프로 세 스 는 어떻게 해야만 하위 프로 세 스 의 오류 정 보 를 얻 을 수 있 습 니까?
이 곳 에서 우 리 는 하위 프로 세 스 의 오류 출력 을 표준 출력 (2 > & 1) 으로 바 꿀 수 있 습 니 다. 그러면 부모 프로 세 스 가 하위 프로 세 스 의 오류 정 보 를 포착 할 수 있 습 니 다.예 를 들 어 command 는 "ls nofile. txt 2 > & 1"이 고 출력 은 다음 과 같 습 니 다.
명령 [ls nofile. txt 2 > & 1] 출력 [ls: nofile. txt: 그런 파일 이나 디렉토리 없 음]
명령 [ls nofile. txt 2 > & 1] 하위 프로 세 스 종료 상태 [256] 명령 반환 값 [1]
첨부: 하위 프로 세 스 의 종료 상태 판단 과 관련 된 매크로, 프로 세 스 종료 상 태 를 status 로 설정 합 니 다.
WIFEXITED (status) 는 하위 프로 세 스 가 정상적으로 끝나 면 0 값 이 아 닙 니 다.
WEXITSTATUS (status) 는 하위 프로 세 스 exit () 가 되 돌아 오 는 종료 코드 를 가 져 옵 니 다. 일반적으로 WIFEXITED 로 정상 적 인 종료 여 부 를 판단 해 야 이 매크로 를 사용 할 수 있 습 니 다.
WIFSIGNALLED (status) 하위 프로 세 스 가 신호 로 끝나 면 이 매크로 값 은 진짜 입 니 다.
WTERMSIG (status) 는 하위 프로 세 스 가 신호 로 중 지 된 신호 코드 를 가 져 오 며, 일반적으로 WIFSIGNALLED 로 판단 한 후에 이 매크로 를 사용 합 니 다.
WIFSTOPPED (status) 하위 프로 세 스 가 일시 정지 상태 에 있 으 면 이 매크로 값 은 진짜 입 니 다.일반적으로 WUNTRACED 를 사용 할 때 만 이 상황 이 발생 한다.
WSTOPSIG (status) 는 하위 프로 세 스 를 일시 정지 시 키 는 신호 코드 를 가 져 옵 니 다. 일반적으로 WIFSTOPPED 로 판단 한 후에 이 매크로 를 사용 합 니 다.
2011 - 11 - 12 임 홍 채[email protected]
전재 출처 를 밝 혀 주 십시오.

좋은 웹페이지 즐겨찾기