0

私はいくつかのUnixコマンドをテストするための小さなcプログラムを実行しています。私はユーザーにテストできる選択肢を提供し、ユーザーが自分の選択肢を入力できるようにします。ユーザーが選択として番号2を入力した場合、ファイルに対してgrepコマンドをテストする次のコードを実行する必要があります。しかし、「パターン」を入力すると、コードに問題が発生し、無限ループが開始されます。Unixプログラミングの経験はあまりありません。番号2を選択すると問題が発生します。これは、ケース2の場合であることを意味します。

  #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;
  }
4

2 に答える 2

1

execlp()または関数ファミリーはexec()、現在のプロセスイメージを新しいプロセスイメージに置き換えるため、execlp()終了すると子は終了しますが、fork()ゼロ以外の値を親プロセスに返します。

重要な点は、fork()2つの独立したプロセスが実行された後です

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

また、指定されていない実行順序を制御することはできません。したがってwait(NULL)、子コードが終了した直後に親コードを入力します。

そのため、親は子が終了するまで待機します。そうしないと、両方の独立したプロセスがこのように実行されます。親だけが実行されていることに気付く場合もあれ(that's infinite loop)ば、子も実行されていることに気付く場合もあります。

于 2012-11-25T19:48:46.507 に答える
0

これが無限ループに陥る可能性があると私が思う唯一の理由は、execl()失敗したときです。何が問題になっているのかを確認するには、後でerrnoを印刷しexecl()てください。

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

break;
于 2012-11-25T19:28:20.080 に答える