2016-09-26 6 views
0
void execute(char **argv,int num) 
{ 
    int i; 
    pid_t pid; 
    int status; 
    int child_status; 

    if ((pid = fork()) < 0) 
    {  /* fork a child process*/ 
     printf("*** ERROR: forking child process failed\n"); 
     exit(1); 
    } 
    else if (pid == 0) 
    {   /* for the child process: */ 
     int c; 
     if (c==execvp(argv[0], argv) < 0) 
     {  /* execute the command */ 
      printf("%d\n", c); 
      printf("*** ERROR: exec failed\n"); 
      perror(" "); 
      exit(1); 
     } 
    } 
    else if(bg!=1){ 
     while (waitpid(pid,&status,WNOHANG|WUNTRACED)); 
    } 
    else if(bg==1) 
    { 
     wait (&child_status); 
     if (WIFEXITED (child_status)) 
     { 
      printf("the child process exited normally, with exit code %d\n", 
        WEXITSTATUS (child_status)); 
     } 
     else 
      printf ("the child process exited abnormally\n"); 
    } 
} 

이것은 내 사용자 정의 쉘에서 실행 기능입니다. gedit &과 같은 작업을 수행하면 다음 프롬프트가 인쇄되기 전에 종료 상태가 인쇄됩니다. 이 문제를 어떻게 해결할 수 있습니까? 내가 뭘 잘못하고 있니?프로세스가 종료되기 전에 프로세스의 종료 상태가 출력됩니다.

+0

"인쇄 전에"는 무엇을 의미합니까? 나중에 인쇄 하시겠습니까? –

+0

자식 프로세스가 종료되면 종료 상태가 올바르게 표시되어야합니까? gedit처럼 백그라운드에서 텍스트 편집기를 엽니 다. 해당 프로세스에서 닫기를 클릭하면 종료 상태가 표시됩니다. 그 전에 프로세스는 여전히 실행 중입니다. –

+0

이미 실행중인 gedit 인스턴스가 있고 다시 실행하면 새 인스턴스가 즉시 종료됩니다. 많은 GUI 프로그램이이를 수행하므로 비 GUI GUI로 시도하십시오. – redneb

답변

0

변수 bg가 설정 되더라도 함수가 끝날 때까지 기다리는 블록을 실행하십시오. 즉, 백그라운드에서 프로세스를 실행하든 실행하지 않든 동일한 동작을 얻습니다.

몇 가지 제안 :

  • 당신이 백그라운드에서 프로세스를 실행하려면, (waitpid를 호출하지 않는) 또는 실행() 대신 단지 PID를 반환) (기다립니다. 호출자는 프로세스 종료시기를 감지해야합니다.
  • execute()가 foreground 프로세스를 실행하는 경우 -1과 같이 알려진 비 프로세스 PID를 반환하므로 호출자는이를 백그라운드 프로세스 목록에 추가하지 않습니다.
  • 호출자는 포어 그라운드 프로세스가 완료되거나 백그라운드 프로세스가 실행 된 후 프롬프트가 인쇄되기 전에 백그라운드 프로세스 목록을 확인해야합니다. 비 블로킹 호출로이 작업이 완료되었는지 확인하십시오.
  • 실행할 매개 변수로 bg를 전달하십시오.