2014-12-26 3 views
1

코드 중간에 복사 할 디렉토리가 필요한 C 프로그램을 작성하고 있습니다. 그래서 나는 fork와 execvp를 사용하려고하는이 함수를 썼다. 그러나이 코드는 pid == 0을 입력하는 것으로 보이지 않으며 0보다 작지 않습니다. 무엇이 잘못 될 수 있습니까? 그포크에서 Pid가 0이 아니거나 0보다 작습니다 (minix)

void execCopy() { 
    printf("I'm in execCopy\n"); 
    printf("ERROR 0: %s\n",strerror(errno)); 


    int pid = fork(); 

    if(pid < 0) { 
     printf ("fork failed with error code= %d\n", pid); 
     fprintf(stderr,"FORK error\n"); 
    } 

    printf("ERROR 1: %s\n",strerror(errno)); 

    char *execArgs[] = { "cpdir", "-R", copy_path,paste_path, NULL }; 

    printf("Copy from %s to %s\n",copy_path,paste_path); 

    if(pid == 0) { 

     printf("I'm gonna exec\n"); 
     execvp("cpdir", execArgs); 
     printf("I should never get here \n"); 

    } 

    else { 
     printf("I'm the father, going to return\n"); 
     printf("ERROR 2: %s\n",strerror(errno)); 

     return; 
    } 
} 

OUTPUT

Dec 26 20:34:11 192 kernel: I'm in execCopy 
Dec 26 20:34:11 192 kernel: ERROR 0: Not a directory 
Dec 26 20:34:11 192 kernel: ERROR 1: Not a directory 
Dec 26 20:34:11 192 kernel: Copy from /./home to /./home/lcom 
Dec 26 20:34:11 192 kernel: I'm the father, going to return 
Dec 26 20:34:11 192 kernel: ERROR 2: Not a directory 
+1

errno의 값을 변경하지 않고 strerror (errno)를 호출하는 이유 – sas

+0

* 입력 *하자마자'errno'는 이미 'ENOTDIR'로 설정되어 있습니다. – WhozCraig

+0

'printf ("PID : % d \ n", pid);'시도한 적이 있습니까? 특히 방금 조립 된 줄을 출력하는'\ n'의 사용에주의하십시오. 따라서'fflush()'없이 출력 할 수있는 출력 * 및 *를 더 잘 읽을 수 있습니다. – glglgl

답변

2

출력 버퍼링이 자식 프로세스 출력을 삼키는 수 있습니다 중요한 경우 내가 미닉스를 사용하고 있습니다. exec 앞에 fflush(stdout)을 시도하십시오.

편집 : 포크 후 두 개의 오류 1과 두 개의 줄 복사가 표시됩니다. 하위 프로세스 출력이 표시되지 않습니다.

+0

printf ("exec \ n");) 전에 플러시하려했습니다. " 당신이 설명 했었지만 여전히 출력물을 보지 못했습니다 ... 그 행을 어디에 써야하는지 오해 했습니까? 또한 exec가 올바르게 실행되는지 확인하는 방법이 있습니까? 왜냐하면 어떤 사본도 만들어지지 않기 때문입니다. 노력을 주셔서 감사합니다 –

+0

또한 각 인쇄의 끝에 \ n을 사용하여 플러시 할 필요없이 작업을 수행해야합니다. 맞습니까? 나는 각 printf의 끝에서 \ n을 추가하고 fork 후 –

+0

"copy from"printf (그리고 pid == 0 if 앞에) 바로 다음에 fflush를 시도한 후에도 여전히 하나의 프로세스 만 얻는다. 그렇습니다. stdout은 전통적으로 줄 바꿈되어 있지만, 미닉스는 다를 수 있습니다. 포크 자체가 작동하는지 확인하려면 포크 바로 뒤에'write (1, "forked \ n", 7)을 삽입하십시오. 두 번 인쇄해야합니다 (상위 + 하위). – Andras