Execvp在前景中

时间:2013-11-14 01:49:01

标签: c process execvp

我无法让execvpsystem()的工作方式类似。

当我使用代码时:

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 个答案:

答案 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