我无法让execvp
与system()
的工作方式类似。
当我使用代码时:
int cstatus; /* Exit status of child. */
pid_t cpid;
switch (cpid = fork ()) {
case -1:
printf("fork");
case 0: // child
system("./file");
printf("child->");
default:
pid_t tpid = wait(&cstatus);
printf("parent\n");
}
./file
按预期运行并打印child->parent
但是当我尝试使用以下命令运行程序时
int cstatus; /* Exit status of child. */
pid_t cpid;
switch (cpid = fork ()) {
case -1:
printf("fork");
case 0: // child
execvp("file", NULL);
printf("child->");
default:
pid_t tpid = wait(&cstatus);
printf("parent\n");
}
我得到child->parentparent
的输出,并且该文件未在命令提示符中显示输出(从file
生成)。
我在这里做错了吗?我本质上是试图让file
在前台运行并让父母等到它完成。
答案 0 :(得分:0)
差异部分是execvp()
除非失败时才返回,但system()
总是返回。因此,system()
是fork + exec
的替代(封面函数)。您还需要考虑当前目录是否在PATH上。
答案 1 :(得分:0)
您在每个案例块的末尾错过了break;
。
我忽略了你没有为execvp提供不正确的参数。
您需要以下内容:
.
.
char *argv2[2];
.
.
case 0: // child
argv2[0] = "file";
argv2[1] = NULL;
execvp("file", argv2);
printf("child->");
break;
.
.
答案 2 :(得分:0)
您还可以添加“。”到PATH环境变量,执行命令PATH=$PATH:.
答案 3 :(得分:0)
检查您的目录是否已通过
添加到PATH环境变量中echo $PATH
如果PATH
中未列出包含文件的目录,则必须按
PATH=$PATH:/myDirectory