在execvp()上获得无限循环

时间:2015-02-04 17:31:04

标签: c bash fork execvp

我正在学习fork()如何工作,并且在调用execvp(argh[0], argv);

时遇到无限循环

这是我的计划:

 int main (int argc, char *argv[])
 {
    pid_t pid;
    pid = fork();
    if (pid < 0) { // error occurred 
            printf("Something went wrong!\n");
            exit(-1);
    } else if (pid == 0) { // child process 
            printf("Child process.  ");
            if(argc == 1 || argc == 0) {
                    printf("No arguments provided. Terminating child.\n");
                    exit(0);
            } else if(argc == 2) {
                    printf("One argument provided.\n");
                    execlp(argv[1], argv[1], NULL);
            } else {
                    printf("More than one argument\n");
                    execvp(argv[0], argv); // *** It's right here ***
            }
    } else { // parent process 
            printf("PARENT started with pid=%d.\n", pid);
            int status = 0;
            pid_t wait(int *status);
            printf("PARENT resumed with status code: %i.  Now terminating parent.\n", status);
            exit(0);
    }
    return 0;
 }

我尝试使用此代码execvp(argv[0], argv)执行传递给函数的操作(和参数),但是当我执行./arguments ls -l时我得到一个无限循环}。我应该如何调用execvp?或者我应该打电话给另一种方法?

感谢您的帮助

--- ---更新

我在答案中提出了更改建议,即调用execvp(argv[1], argv);(将争论[0]更改为争论[1]),我现在得到cannot access ls: No such file or directory而不是无限循环。

1 个答案:

答案 0 :(得分:4)

执行./arguments ls -l后,您的代码正在执行execvp("./arguments", {"./arguments", "ls", "-l"})。你的程序是无限的分叉和调用自己:你已经fork-bomb。 :)

这是因为argv[0]您的可执行文件(即 ./ arguments )。

您应该使用argv[1]代替,如下所示:

execvp(argv[1], &argv[1]);

注意你必须改变第一个和第二个参数。

执行时,该行将等同于:execvp("ls", {"ls", "-l"})