【问题标题】:Getting infinite loop on execvp()在 execvp() 上获取无限循环
【发布时间】:2015-02-04 17:31:04
【问题描述】:

我正在学习 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);(将 arguv[0] 更改为 arguv[1]),现在我得到 cannot access ls: No such file or directory 而不是无限循环。

【问题讨论】:

    标签: c bash fork execvp


    【解决方案1】:

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

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

    你应该改用argv[1],像这样:

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

    请注意,您必须同时更改第一个和第二个参数。

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

    【讨论】:

    • 感谢您的浏览。我做了那个改变,现在我得到了cannot access ls: No such file or directory
    • 您是说argv+1 吗?
    • argv+1 似乎与 &argv[1] 完全一样
    • @WeatherVane:我发现&amp;argv[1] 更直观,因为从那个表达式我可以很容易地猜出 argv 是一个数组,而无需查看类型声明。
    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2019-12-17
    • 2014-03-13
    • 2021-11-03
    相关资源
    最近更新 更多