2013-01-25 2 views
0

내 C 프로그램에서 자식 프로세스를 만들고 자식 프로세스에서 execvp를 실행하고 있습니다. 하지만 execvp 명령 (오류가있는 경우)에 대해 오류 메시지를 다른 것으로 변경하려고합니다.dup2를 하위 프로세스와 함께 사용하는 방법은 무엇입니까?

나는 그것을 반환 있다면, 그 다음 내가 다음 줄에 내 자신의 사용자 지정 오류 메시지를 인쇄 할 수 있습니다, 오류라고 것을 알고있다. 이것은 발생할 수있는 오류의 한 유형입니다. 예를 들어 execvp에 "sdfsd"명령을 주면이 문제가 발생합니다. 이 부분은 저를 위해 일하고 있습니다.

하지만 입력하면, 다음 반환 및 인쇄 "찾기 :`sdfsd ': 해당 파일이나 디렉토리"하지 않는다 "sdfsd 찾을 수 있습니다."

나는 내 자신의 사용자 정의 하나에 (exevcp에서 오는 오류 메시지와 본질적으로 어떤 종류)이 메시지를 변경하고 싶습니다.

는 내가이 일을 dup2에 사용할 수 있습니다 생각하지만, 나는

dup2(STDERR_FILENO, 1); 
fclose(stderr); 

을 시도 자식 프로세스에서

... 방법을 잘 모르겠어요하지만 이것은 단지 서면에서 자식 프로세스를 중지 오류 메시지. 나는 아직도 모든 경우에 내 자신의 메시지를 인쇄 할 수 없습니다.

누구에게 어떻게 해야할지 알고 있습니까? thanks

답변

1

execvp은 새 프로그램을 성공적으로 시작하면 결코 반환하지 않으므로 프로그램 실행 후 execvp이 실패하면 자식 프로세스에서 사용자 자신의 오류 메시지를 인쇄 할 수 없습니다. 한 가지 옵션은 부모 프로세스에 stderr을 파이프하고 거기에 오류 메시지를 가로 채고 자신의 오류 메시지를 인쇄하는 것입니다. 예를 들어

:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    int ff, p[2]; 
    FILE *f; 
    char *vv[] = {"find", "garbage", (char *)NULL}; 
    char msg[100]; 

    if (pipe(p) != 0) 
    { 
    fprintf(stderr, "Pipe failed\n"); 
    return 1; 
    } 

    if ((ff = fork()) == -1) 
    { 
    fprintf(stderr, "Fork failed\n"); 
    return 1; 
    } 

    if (ff == 0) 
    { 
    /* In the child process */ 
    close(2); 
    close(p[0]); 
    dup2(p[1], 2); 
    execvp("find", vv); 
    return 1; 
    }; 

    /* In the parent process */ 
    close(p[1]); 
    f = fdopen(p[0], "r"); 
    if (f == NULL) 
    { 
    fprintf(stderr, "Fdopen failed\n"); 
    return 1; 
    } 
    if (fgets(msg, sizeof(msg), f) == NULL) 
    { 
    fprintf(stderr, "Fgets failed\n"); 
    return 1; 
    } 
    printf("Error message was: %s", msg); 
    /* and so on */ 
    return 0; 
} 
+0

는 모든 파이프와 파일 디스크립터를 닫을 필요하지? – omega

+0

프로세스가 끝나면 자동으로 닫아야합니다. 실제 프로그램에서는이 작업을 수행하기 전에 정리하는 것이 좋습니다. –

+0

기본적으로 부모 프로세스에서 마지막 부분에서 파이프의 읽기 끝에서 읽을 때 NULL이면 파이프 프로세스의 쓰기 끝 부분에 아무 것도 기록되지 않고 오류가 없음을 의미합니다. NULL이 아니면 자식 프로세스에서 파이프의 쓰기 끝 부분에 무언가가 기록되어 오류가 발생했음을 의미합니다. 이게 옳은 거니? – omega

관련 문제