我正在尝试编写一个将分叉的程序,然后打开一个文件并执行它。它应该执行的文件称为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);
}
答案 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
。