0

これが通常の動作をする理由を誰かが説明してくれませんか (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 を使用したいと思います。助けていただければ幸いです。

4

1 に答える 1

2

char **args = {"ls", NULL};である必要があり、2番目(の)char *args[] = {"ls", NULL};についても同じです。argscat

(ここでは遅すぎるので、最初にコンパイルする理由を考えることはできません。少なくとも警告が表示されます)。

于 2013-01-25T22:48:07.170 に答える