【问题标题】:Return value of execl [duplicate]execl的返回值[重复]
【发布时间】:2014-12-28 13:34:00
【问题描述】:

我正在运行 execl 函数来通过我的代码编译程序。我想检查编译是否正确。所以我写了b = execl("usr/bin/gcc","cc",path,NULL);,后来又查了if( b==-1)。但即使编译中有错误,它也没有进入 if 语句。 任何想法为什么? 谢谢!

int b=0;
if ((pid1 = fork())<0)
    perror("Error forking");
else {
    if(pid1==0)
        b= execl("/usr/bin/gcc","cc",path,NULL);
    else wait(&status);
}
if(b==-1)
    printf("\n--------\n");

【问题讨论】:

  • 如果exec 系列中的任何函数成功,它们不会返回。他们只在失败的情况下返回。
  • 如果你在编译中遇到错误,那么就不会生成任何新的可执行文件,所以你的问题有矛盾:“我的程序不能像我预期的那样工作,它没有编译”。代码不会像预期的那样工作因为你有一个编译器错误,实际上代码根本不会运行,因为你没有程序可以运行。
  • 但这就是问题所在——我故意写了一些东西来在编译过程中出错,但没有进入 if 语句
  • 要么存在编译器错误,您需要修复它,要么获得可以运行的程序。你不能两者兼得。
  • 啊——Joachim,编译错误发生在在被调用的程序中。我认为它仍然没有返回,因为 call 本身 没有失败——编译器确实运行并做了它的事情,所以那里没有错误。你需要另一个函数来调用它;可能是system

标签: c linux gcc exec


【解决方案1】:

如果exec 成功,它将永远不会返回。成功意味着能够找到并启动命令。如果不成功,它将返回 -1。

您需要的是从父进程中wait中使用的status中提取命令的退出值。

您有一些宏来确定子进程的运行状态。

  • WIFEXITED(status) 将告诉您命令是否因调用 exit
  • 然后您将能够获得退出状态 WEXITSTATUS(status)

如果 status 等于 0,那么您将知道该命令运行成功,任何其他值都表示该命令无法正常执行其任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2018-03-01
    • 2023-03-06
    • 2021-12-05
    • 2019-07-12
    • 2014-11-18
    相关资源
    最近更新 更多