2012-08-31 10 views
0

C 프로그래밍을 잘 알고 있지만 유닉스 시스템 호출에 대한 많은 경험이 없습니다. 나는 오랫동안 나의 유닉스 지식을 다시 탐구하고있다. 그래서 fork와 execlp 시스템 호출로 시작했습니다. 나는 우분투 리눅스에서 예제를 연습하고있다.프로그램이 명령문을 실행하지 못했습니다.

다음은 STD_IN의 명령을 받아 들여 하위 프로세스에서 실행하는 텍스트 북 예제 프로그램입니다.

int main (int argc, char *argv[]) { 
    char command[MAX_LINE]; 
    pid_t pid; 
    int status; 

    printf ("%% "); 
    while (fgets (command,MAX_LINE,stdin) != NULL){ 
     if (command[strlen(command)-1] == '\n') 
      command[strlen(command)-1] = '\0'; 

     if ((pid=fork()) < 0) { 
      perror ("fork failed : \n"); 
     } 

     if (pid == 0) { 
      printf (" I am child and my PID is %d",getpid()); 
      execlp (command, command, (char *)0); 
      perror ("couldn't execute:"); 
      exit(127); 
     } 

     printf (" I am parent and my PID is %d\n ",getpid()); 
     if ((pid = waitpid (pid, &status, 0)) < 0){ 
      perror("waitpid error\n"); 
     } 

     printf ("%% "); 
    } 
    exit (0); 
} 

가 좀 printf 문에서도를 넣어하지만 프로그램이 라인 를 인쇄하지 않았다 "나는 아이이고 내 PID는"명령이 성공적으로 실행 될 때마다. 그러나 입력 명령이 잘못되어 실패하면 위의 행을 인쇄합니다.

print 문이 execlp 이전이므로 두 시나리오에서 모두 줄을 인쇄 할 것으로 예상됩니다.

+1

execlp, 즉 fflush (stdout) 전에 printf를 비우고 얻은 결과를 볼 수 있습니다. –

+0

왜 항상 오류를 인쇄하고 강제로 자녀가 빠져 나가야 만합니까? – Anycorn

+0

@ApprenticeQueue : fflush가 문제를 해결할 것임을 알고 있습니다. 프로그램은 printf 이후의 perror의 출력을 표시합니다. 여기, stdout과 stderr 모두 콘솔만을 가리키고 있습니다. – Sach

답변

0

이렇게하면 exec 전에 stdout을 플러시해야합니다.

printf (" I am child and my PID is %d",getpid()); 
fflush(stdout); 
execlp (command, command, (char *)0); 
관련 문제