popen + pclose 셸 명령 실행
2853 단어 LinuxProgramming
메모: 파 이 프 는 표준 출력 만 처리 할 수 있 고 표준 오류 출력 은 처리 할 수 없습니다.
popen 과 pclose 의 실현 은 system 과 유사 하여 파 이 프 를 만 드 는 작업 이 한 단계 더 많아 졌 습 니 다.
popen 은 FILE 핸들 을 성공 적 으로 되 돌려 주 었 습 니 다. NULL 을 되 돌려 주지 못 했 습 니 다. 실패 한 원인 은 fork 나 pipe 가 실 패 했 을 수도 있 고 메모리 할당 에 실 패 했 을 수도 있 습 니 다.
pclose 실패 반환 - 1, 성공 하면 exit status 로 돌아 갑 니 다. system 과 유사 합 니 다. 사용 해 야 합 니 다. WIFEXITED, WEXITSTATUS 등 명령 반환 값 을 가 져 옵 니 다.
또한, 시스템 과 유사 합 니 다. pclose 는 프로 세 스 가 종 료 될 때 까지 기다 릴 것 입 니 다. 프로 세 스 가 종 료 될 때 까지 기다 리 지 않 으 면 error 는 다음 과 같이 설정 합 니 다. ECHILD.
주의:
1. pclose 는 하위 프로 세 스 를 회수 하기 위해 좀 비 프로 세 스 가 발생 하지 않도록 합 니 다.
2. 시스템 과 마찬가지 로 SIGCHLD 여전히 popen 에 영향 을 줄 수 있 습 니 다. 예제 프로그램 을 보십시오.
#include
#include
#include
#include
#include
typedef void (*sighandler_t)(int);
int main(int argc, char* argv[])
{
char cmd[1024];
char line[1024];
FILE* pipe;
int rv;
if (argc != 2)
{
printf("Usage: %s
", argv[0]);
return -1;
}
// pclose fail: No child processes
signal(SIGCHLD, SIG_IGN);
snprintf(cmd, sizeof(cmd), "ls -l %s 2>/dev/null", argv[1]);
//sighandler_t old_sighandler = signal(SIGCHLD, SIG_DFL);
pipe = popen(cmd, "r");
if(NULL == pipe)
{
printf("popen() failed: %s
", cmd);
return -1;
}
while(fgets(line, sizeof(line),pipe) != NULL)
{
printf("%s", line);
}
rv = pclose(pipe);
//signal(SIGCHLD, old_sighandler);
if (-1 == rv)
{
printf("pclose() failed: %s
", strerror(errno));
return -1;
}
if (WIFEXITED(rv))
{
printf("subprocess exited, exit code: %d
", WEXITSTATUS(rv));
if (0 == WEXITSTATUS(rv))
{
// if command returning 0 means succeed
printf("command succeed
");
}
else
{
if(127 == WEXITSTATUS(rv))
{
printf("command not found
");
return WEXITSTATUS(rv);
}
else
{
printf("command failed: %s
", strerror(WEXITSTATUS(rv)));
return WEXITSTATUS(rv);
}
}
}
else
{
printf("subprocess exit failed
");
return -1;
}
return 0;
}
설명:
1. SIGCHLD 를 무시 한 후 pclose 는 하위 프로 세 스 종료 정 보 를 회수 할 수 없습니다. errno 는 ECHILD, 잘못된 정 보 는 "No child processes"입 니 다.
2. 파이프 가 stderr 를 캡 처 할 수 없 기 때문에 stderr 를/dev/null 로 재 설정 하 라 고 명령 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.