2009-09-23 2 views
2

안녕하세요, 유닉스 쉘에서 일하고 있는데 두 가지 문제가 있습니다. 당신 중 누구라도 나를 도울 수 있는지 궁금 해서요. 내 첫번째 문제는 쉘이 자식 프로세스가 종료되기를 기다리지 않는다는 것이다. 자식 프로세스가 실행되는 동안 실제로 더 많은 명령을 입력 할 수 있습니다. 내 두 번째 문제는 다음 두 줄에 있습니다. 나는 쉘에 어떤 디스플레이도 얻지 못하고있다. I는 명령을 실행 호출하는 곳, 즉 파이어 폭스, LS -a 등execv, wait, 유닉스 프로그래밍, 아이를 기다리는 법

void execute(char *command[], char *file, int descriptor){ 
    pid_t pid; 
    pid = fork(); 

    if(pid == -1){ 
     printf("error in execute has occurred\n"); 
    } 
    if(pid == 0){   
     execvp(*command,command); 
     fprintf(stderr, "Process name is: %s\n", commandArgv[0]); 
     fprintf(stderr, "Child pid = %d\n", pid); 
     wait(&status); 
      exit(EXIT_SUCCESS); 
    } 
    else{ 
     printf("ignore for now\n"); 
    } 
} 

:

fprintf(stderr, "Process name is: %s\n", commandArgv[0]); 
    fprintf(stderr, "Child pid = %d\n", pid); 

는 I는 사용자가 입력하는 처리를 실행하기 위해 이하의 방법이있다. 그것은 잘 작동하고 프로세스를 시작하지만, 그것이 끝날 때까지 기다리지 않습니다.

execute(commandArgv, "STANDARD",0); 

내가 뭘 잘못하고 있는지 알겠습니까? 감사합니다. 언제든지 도와 주시면 감사하겠습니다.

+0

실행 호출 후 대기 이동되었습니다. 그것은 잘 작동했다. 고맙습니다. – user69514

+0

또는 자식을 fork() 한 후에 부모가 실행하는 코드의 "지금 무시"부분으로 이동하십시오. –

답변

4

execvp()가 실행되면 절대로 되돌아 오지 않습니다. 실행중인 응용 프로그램이 제공 한 내용으로 메모리 내에서 대체됩니다. 따라서 fprintf() 및 wait()가 잘못된 위치에 있습니다.

+0

질문 다시 읽기 ... 아마도 명령을 실행하기 위해 system()을 호출해야합니다. 아니면 구체적으로 execvp를 fork하고 싶습니까? –

+0

예 포크를 실행하고 execvp해야합니다. – user69514

1

실제 논리가 제대로 작동하는 것 외에도 (Stéphane의 제안은 모두 좋음) fprintf-ing 후 fflush (stderr)를 사용하여 오류 메시지가 버퍼링되지 않고 바로 출력되도록 할 수 있습니다.

1

프로세스가 작동하는 방식에 약간의 오류가 있습니다. execvp를 호출하면 되돌릴 수 없습니다. fork()은 부모와 동일한 자식을 갖지만 execvp는 호출하려는 명령이 자식 이미지를 덮어 씁니다.

execvp 은 이미지를 덮어 쓰지 못하도록 심각한 오류가 발생한 경우에만을 반환합니다. 따라서 통화하기 전에 인쇄물을 인쇄해야합니다. 따라서 EXIT_SUCCESSEXIT_FAILURE으로 변경할 수도 있습니다.

이제 대기을 사용하는 또 다른 실수가 있습니다. 항상 부모가 자식을 기다리고 싶습니다. 다른 방법은 아닙니다. 아이가 기다릴 것을 요구할 수는 없습니다. 그녀는 기다릴 것이 아무것도없고, 달리고 끝낼 것입니다. 따라서 () () 번으로 전화를 걸어 야합니다.

void execute(char *command[], char *file, int descriptor) 
{ 
    pid_t pid; 
    pid = fork(); 

    if(pid == -1) 
    { 
     printf("fork() error in execute() has occurred\n"); 
     return; /* return here without running the next else statement*/ 
    } 
    if(pid == 0) 
    {   
     fprintf(stderr, "Process name is: %s\n", commandArgv[0]); 
     fprintf(stderr, "Child pid = %d\n", getpid()); 
     execvp(*command,command); 
     fprintf(stderr, "Error! Can't overwrite child's image!\n"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     printf("Parent waiting for child pid: %d\n", pid); 
     wait(&status); 
     printf("Parent running again\n"); 
    } 
} 

그러나 질문을 읽는 중, 실제로는 부모가 기다리는 것을 원하지 않을 수 있습니다. 이 경우, wait() 기능을 사용하지 마십시오.

테이크 관리, BECO

편집 : 약간의 실수. 자식 pid는 getpid()입니다.

관련 문제