2012-11-25 2 views
0

일부 Unix 명령을 테스트하기위한 작은 c 프로그램을 만들고 있습니다. 나는 그가 테스트 할 수있는 선택권을 사용자에게 제공 한 다음 사용자가 선택을 할 수있게합니다. 사용자가 자신의 선택으로 2 번을 입력하면 파일에서 grep 명령을 테스트하는 다음 코드를 실행해야합니다. 하지만 "패턴"을 입력하면 코드 에 문제가 있습니다. 무한 루프가 시작됩니다. 도움이 필요하십니까? !! 나는 유닉스 프로그래밍에 많은 경험이 없다. 문제는 내 선택으로 숫자 2를 입력 할 때 나타납니다이 경우 2 번execl에서 grep을 사용하면 무한 루프가 시작됩니까?

#include <unistd.h> 
    #include <sys/types.h> 
    #include <errno.h> 
    #include <stdio.h> 
    #include <sys/wait.h> 
    #include <stdlib.h> 

    int main(){ 
    char pattern[50]; 
    int userInput; 
    pid_t childPID; 
     char filename[50]; 
    FILE *file;  

    printf("Enter a File name:");  
    scanf("%s",filename);  

     file = fopen(filename, "r"); 


do{ 
    printf("Enter what u want to do with the file:\n"); 
    printf("1.Compress the file.\n"); 
    printf("2.Search for a pattern at the file\n"); 
    printf("3.Read the file (display the file content at the terminal)\n"); 
    printf("4.Eject the program\n"); 

     scanf("%d",&userInput); 
switch(userInput){ 
    case 1: 
     if(childPID == 0){ 
      execl("/bin/gzip","gzip",filename,NULL); 

      exit(1); 
      }  
     break; 
    case 2: childPID = fork(); 
     if(childPID ==0){ 
      printf("Enter the pattern you want to search about:"); 
      scanf("%s",pattern); 


      execl("/bin/grep","grep",pattern,filename,NULL); 
     } 
     break; 

    } 

}while(userInput != 4); 
return 0; 
    } 
+0

패턴 정의는 어떻게됩니까? 그것은 당신의 예제 패턴 문자열을 담을만큼 충분히 큽니까? –

+0

당신은 옵션'-f'를 사용해야한다고 생각합니다.''-f "'와''filename'을 패스하는 것을 의미합니다. – Omkant

+0

@OlafDietsche, 어떻게 패턴을 정의했는지입니다. char pattern [50]; –

답변

1

기능의 execlp() 또는 exec() 가족이 새로운 프로세스 이미지로 현재 프로세스 이미지를 대체하므로 execlp() 종료 후 아이 fork() 수익률 상위 프로세스에 0이 아닌 값을 제외한 종료 될 때.

주요 포인트가 두 개의 독립적 인 프로세스

1st : main process called parent 
2nd : child process 

이 그리고 당신이 지정되지 않은의 자신의 실행 순서를 제어 할 수 fork()을 수행 한 후입니다. 그래서 wait(NULL)을 자식 코드가 끝난 직후에 부모 코드에 넣으십시오.

부모가 자식이 종료 될 때까지 대기하게됩니다. 그렇지 않으면 두 독립 프로세스가 이러한 방식으로 실행됩니다. 때로는 오직 부모 만 (that's infinite loop)을 실행하지만 그 자식도 실행중인 것을 볼 수 있습니다.

+0

맞습니다. 무한 루프가 작동하고 멈 춥니 다. 고맙습니다. –

+0

@GhadeerWalid : 언제든지 환영합니다. – Omkant

0

execl()이 실패 할 때이 무한 루프에 들어갈 수있는 볼 수있는 유일한 이유는에 있다는 것을 의미한다. execl() 이후에 errno를 인쇄하여 잘못된 점을 확인하십시오.

... 
    execl("/bin/grep","grep",pattern,filename,NULL); 
    printf("errno=%d\n", errno); 
} 

break; 
+0

무엇을 알기 위해 프로그램을 실행하는 것을 멈출 수 없습니다 오류입니까?! –

관련 문제