1

我无法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在前台运行并让父母等到它完成。

4

4 回答 4

0

您错过break;了每个案例块的末尾。

而且我忽略了您没有为 execvp 提供不正确的参数。

你需要类似的东西:

.
.
char *argv2[2];
.
.
case 0: // child
    argv2[0] = "file";
    argv2[1] = NULL;
    execvp("file", argv2);
    printf("child->");
    break;
.
.
于 2013-11-14T02:36:45.050 回答
0

您也可以添加“。” 到PATH环境变量,执行命令PATH=$PATH:.

于 2013-11-14T03:33:17.457 回答
0

不同之处在于,execvp()除非失败,否则不会返回,但system()总是返回。所以,system()fork + exec. 您还需要考虑当前目录是否在您的 PATH 上。

于 2013-11-14T02:23:41.027 回答
0

检查您的目录是否已添加到 PATH 环境变量中

echo $PATH

如果包含文件的目录未在 中列出PATH,那么您必须通过添加它

PATH=$PATH:/myDirectory
于 2013-11-14T03:43:43.763 回答