【问题标题】:Running a C program using execlp()?使用 execlp() 运行 C 程序?
【发布时间】:2014-03-03 06:21:54
【问题描述】:

所以我有一个名为“hello.c”的 c 程序,它最后只做“exit(2)”。我尝试在我的子进程中运行它,然后将返回值传递给我的父进程并打印相应的消息。但不知何故,程序总是在 0 处退出并打印“exit at 0”消息。谁能告诉我为什么?

pid_t pid;
int status;

pid = fork(); 

if (pid == -1){
    perror("fork");
    exit(1);
} 
if (pid >0){
    /*abusive parents*/
    waitpid(pid, &status, 0);

    if(WEXITSTATUS(status)==3){
        printf("exit at 3\n");
    }
    if(WEXITSTATUS(status)==2){
        printf("exit at 2\n");
    }
    if(!(WEXITSTATUS(status))){
        printf("exit at 0\n");
    }

}
else{
    /*stupid child*/
    execlp("hello.c",NULL);
}


return 0;}

这里是 hello.c:

int main(void){
   int teemo=0;

   exit(2);
}

【问题讨论】:

  • 你不运行 C 程序,你运行编译后的可执行文件...所以execlp("hello.c",NULL) 应该是execlp("hello.bin",NULL)
  • @BasileStarynkevitch 仍然得到 0。我必须先编译那个c程序吗?
  • 如果你使用的是IDE,我建议你暂时停止使用它并切换到命令行工具。这应该可以帮助您获得一些相关的直觉。

标签: c linux process exec fork


【解决方案1】:

您不能运行 C 源文件,您需要编译(和链接)它以生成可执行文件,然后运行该文件。因此,你应该做类似的事情

  1. 先编译hello.c(我想你正在使用gcc

    gcc -o hello hello.c
    
  2. 像这样在你的第一个程序中运行hello

    execlp("./hello", "hello", NULL);
    

那么你应该得到你所期望的。

【讨论】:

    【解决方案2】:

    (不仅)为了更好地了解代码中发生的情况,请添加错误检查。

    在您的具体情况下,至少将其添加到对execlp() 的调用中。为此,请先查看exec*()s documentation:

    返回值

    exec() 函数仅在发生错误时返回。返回值为-1,设置errno表示错误。

    然后增强您的代码以涵盖这种情况:

        ...
      }
      else /* child */
      {
        if (-1 == execlp("hello.c"))
        {
          perror("execlp() failed");
          return 1;
        }
      }
    
      return 0;
    }
    

    您将观察到有关调用execlp() 的错误消息。

    这是由于hello.c 很可能不是可执行文件,而是一个普通的文本文件,C-source


    看着documentation 仔细阅读:

    名单 参数必须由一个空指针终止,并且,因为这些是 可变参数函数,此指针必须强制转换 (char *) NULL。

    由此我们了解到,对exec*() 函数族的execl*() 成员的调用总是会这样结束:

    execlp(..., (char *) NULL)
    

    【讨论】:

      【解决方案3】:

      只是补充一下为什么在这种情况下它总是返回零

      这是因为当 execlp 失败并返回 -1 时,父进程在 main 函数的末尾使用返回值,在这种情况下为 0。如果将其更改为 2 或 3,您将看到程序使用 if check ==3 或 ==2 访问该代码。

      【讨论】:

        猜你喜欢
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多