使用execlp()运行C程序?

时间:2014-03-03 06:21:55

标签: c linux process exec fork

所以我有一个名为“hello.c”的程序,除了“exit(2)”之外什么都不做。我试图在我的子进程中运行它,然后将返回值传递给我的父进程并打印相应的消息。但不知何故,程序始终从0退出并打印“退出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);
}

3 个答案:

答案 0 :(得分:2)

您无法运行C源文件,需要编译(并链接)它以生成可执行文件,并运行此文件。因此,您应该执行类似

的操作
  1. 首先编译hello.c(我想您正在使用gcc

    gcc -o hello hello.c
    
  2. 在您的第一个程序中运行hello,如下所示

    execlp("./hello", "hello", NULL);
    
  3. 然后你应该得到你所期望的。

答案 1 :(得分:1)

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

在您的具体情况下,至少将其添加到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- 来源


查看documentation更接近的人:

  

列表          参数必须由空指针终止,因为它们是          可变参数函数,必须将此指针强制转换为(char *)NULL。

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

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

答案 2 :(得分:0)

添加为什么在这种情况下它总是返回零

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