无法获取execvp来执行文件

时间:2017-09-13 15:29:37

标签: c

我正在尝试编写一个将分叉的程序,然后打开一个文件并执行它。它应该执行的文件称为child,它已被编译。当我键入./child时,它会运行。但是,当我运行此程序时,它不执行子程序,并且系统提示我输入“执行失败”中的错误消息。我做错了什么?

这是我的父类

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>



int main (int argc, char **argv)
{ 

pid_t parent = getpid();
pid_t pid = fork();


if (pid == -1)
{
// error, failed to fork()
} 
else if (pid > 0)
{
int status;
 waitpid(pid, &status, 0);
}
else 
{

int var = execvp("./child", NULL);

if(var < 0)
{
    printf("Execution failed");
}

}
exit(0);   // exec never returns
}

这是孩子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (int argc, char **argv)
{   
printf ("Im the child");
exit (0);
}

1 个答案:

答案 0 :(得分:1)

我实际上并不知道你做错了什么。在复制和编译(以及几个警告投诉)后,您的代码运行正常(GCC 7.2)。

显然,child必须位于运行主可执行文件的同一个工作目录中(分叉的那个)。

但是我可能会以这种方式编写代码,但我不是分叉的专家:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>

extern int errno;

int main () {
  pid_t pid = fork();

  if (pid < 0) {
    fprintf(stderr, "%s\n", strerror(errno));
    return 1;
  }

  if (pid == 0) {
   int ret = execl("./child", "", (char *)NULL);
   if(ret < 0) {
     fprintf(stderr, "%s\n", strerror(errno));
     return 1;
   }
  } else {
    wait(NULL);
  }
  return 0;
}

至少它告诉你遇到了哪个错误execl