【问题标题】:Determine whether or not execvp succeeded or failed判断 execvp 是成功还是失败
【发布时间】:2015-11-03 00:47:01
【问题描述】:

我正在寻找一种方法来确定函数 execvp 是成功还是失败。我确实知道如果它返回则它失败了,但我正在寻找从 execvp 启动的命令失败的情况。例如在“ls”试图列出一个不存在的文件夹的情况下。从这里我计划添加对逻辑运算符的支持(例如 &&、||)。谢谢。

else {
    int status;
    if (wait(&status) < 0) {
        perror("wait failed");
        exit(0);
    }
    if (status == 0) {
        success = true;
    }
    else {
        success = false;
    }
}

【问题讨论】:

    标签: c unix


    【解决方案1】:

    您需要首先fork() 一个新进程,然后让该新进程调用execvp。然后父进程应调用wait(),这将允许它检索您运行的命令的退出状态(在本例中为ls)。

    检查从wait()获取的返回状态时,一定要使用WIFEXITED()保证子进程正常退出,使用WEXITSTATUS()提取退出状态。

    pid_t pid = fork();
    if (pid == -1) {
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        execlp("/bin/ls","ls","-l","xyz",NULL);
        perror("exec failed");
        exit(1);
    } else {
        int status;
        pid = wait(&status);
        if (WIFEXITED(status)) {
            printf("pid %d exited with status %d\n", pid, WEXITSTATUS(status));
        } else {
            printf("pid %d exited abnormally\n"
        }
    }
    

    【讨论】:

    • 现在我有这个,在检查结束时查看 fork 是否失败。但我不认为我正在从状态中寻找正确的信息。 else if (c_pid &gt; 0) { pid = waitpid(c_pid, &amp;status, 0); if (pid == -1) {perror("wait failed"); exit(0); } if (status == 0) { success = true; } success = false; /* if ((pid = wait(&amp;status)) &lt; 0) { perror("wait..."); exit(1); }*/ }
    • @xythyl 用您的代码更新您的问题。无法在评论中阅读。
    • 谢谢!另外,如何在这里正确发布代码?由于某种原因,它没有任何格式。
    • @xythyl 将代码粘贴到您的问题中,然后按编辑窗口顶部的“{}”按钮对其进行格式化。
    • wait 如何获取肯定状态?根据this 看来,等待实际上无法确定是否成功执行 execvp。
    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2011-04-23
    相关资源
    最近更新 更多