我在让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在前台运行,让父进程等待,直到它完成。
发布于 2013-11-14 10:23:41
不同之处在于,execvp()只在出现故障时才返回,而system()总是返回。因此,system()是fork + exec的替代(覆盖函数)。您还需要考虑当前目录是否在您的路径上。
发布于 2013-11-14 10:36:45
在每个case块的末尾,您都遗漏了break;。
我忽略了你没有为execvp提供不正确的参数。
你需要这样的东西:
.
.
char *argv2[2];
.
.
case 0: // child
argv2[0] = "file";
argv2[1] = NULL;
execvp("file", argv2);
printf("child->");
break;
.
.发布于 2013-11-14 11:33:17
您也可以添加".“要对环境变量进行路径设置,请执行命令PATH=$PATH:.
https://stackoverflow.com/questions/19968021
复制相似问题