0

我正在做一个小的 c 程序来测试一些 Unix 命令。我为用户提供他可以测试的选项,然后允许他输入他的选项。如果用户输入数字 2 作为他的选择,则应运行以下代码,该代码正在测试文件上的 grep 命令。但是当我输入“模式”时代码有问题,它开始一个无限循环,任何帮助?!我在 Unix 编程方面没有太多经验。当我输入数字 2 作为我的选择时出现问题,这意味着它是在 case no.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()or系列函数用新的exec()进程映像替换当前进程映像,因此当execlp()退出时,子进程终止,但fork()向父进程返回一些非零值。

重点是做之后fork()有两个独立的进程

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 回答