【问题标题】:C executing a pipe: execlp works while execvp doesn'tC 执行管道: execlp 有效,而 execvp 无效
【发布时间】:2013-01-25 22:41:06
【问题描述】:

有人可以向我解释为什么这会产生正常行为(ls | cat)

int fd[2]; pipe(fd);
pid_t pid = fork();
if(pid > 0) {
    close(fd[0]);
    close(STDOUT_FILENO);
    dup2(fd[1],STDOUT_FILENO);
    execlp("ls","ls",NULL);
} else if (pid == 0) {
    close(fd[1]);
    close(STDIN_FILENO);
    dup2(fd[0],STDIN_FILENO);
    execlp("cat","cat",NULL);
} else {
    error(1, errno, "forking error");
}

但是当我将 execlp 更改为 execvp 突然没有任何输出并且退出状态为 255?代码:

int fd[2]; pipe(fd);
pid_t pid = fork();
if(pid > 0) {
    close(fd[0]);
    close(STDOUT_FILENO);
    dup2(fd[1],STDOUT_FILENO);
    char **args = {"ls", NULL};
    execvp("ls",args);
} else if (pid == 0) {
    close(fd[1]);
    close(STDIN_FILENO);
    dup2(fd[0],STDIN_FILENO);
    char **args = {"cat", NULL};
    execvp("cat",args);
} else {
    error(1, errno, "forking error");
}

我真的很想使用 execvp,因为我将执行带有可变长度 arg 列表的命令。非常感谢您的帮助。

【问题讨论】:

  • 您是否启用了所有编译器警告?!

标签: c exec fork pipe gnu


【解决方案1】:

char **args = {"ls", NULL}; 应该是char *args[] = {"ls", NULL};,第二个args 也是一样的(对于cat)。

(这里太晚了,想不到第一个编译的原因。至少它给出了警告)。

【讨论】:

  • 哦,哈哈,你完全正确。我忘记了警告有多重要。谢谢。
猜你喜欢
  • 2016-02-16
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多