[IPC 통신] 파이프 기반 popen 과 pclose 함수
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]
전재 출처 를 밝 혀 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.