Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用fork和pipe在C中执行控制台命令_C_Linux_Bash_Fork_Pipe - Fatal编程技术网

无法使用fork和pipe在C中执行控制台命令

无法使用fork和pipe在C中执行控制台命令,c,linux,bash,fork,pipe,C,Linux,Bash,Fork,Pipe,我试图在C语言上编写程序,它执行控制台shell命令 cat log.txt | awk'{print$7}'| head-10 但是第三个命令在2出现时不起作用。 这就是我所做的 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { int fd[2], status; pipe(fd);

我试图在C语言上编写程序,它执行控制台shell命令

cat log.txt | awk'{print$7}'| head-10

但是第三个命令在2出现时不起作用。 这就是我所做的

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() 
{
    int fd[2], status;

    pipe(fd);
    pid_t pid1 = fork();

    if (!pid1) 
    { 
        dup2(fd[1], 1);
        close(fd[0]);
        close(fd[1]);
        char* command[3] = {"/bin/cat", "log.txt", 0}; 
        execvp(command[0], command);
        exit(EXIT_FAILURE);
    } 
    else if (pid1 == -1) 
    {
        fprintf(stderr, "Can't fork, exiting...\n");
        exit(EXIT_FAILURE);
    }

    pid_t pid2 = fork();

    if (!pid2) {
            dup2(fd[0], 0);
            close(fd[0]);
            close(fd[1]);

            char* command[3] = {"awk", "{ print $7 }", 0}; 
            execvp(command[0], command);

            exit(EXIT_FAILURE);
    } else if (pid2 == -1) {
            fprintf(stderr, "Can't fork, exiting...\n"); 
            exit(EXIT_FAILURE);
    }

    pid_t pid3 = fork();

    if (!pid3) {
            dup2(fd[0], 0);
            close(fd[0]);
            close(fd[1]);

            char* command[3] = {"head", "-10", 0}; 
            execvp(command[0], command);

            exit(EXIT_FAILURE);
    } else if (pid3 == -1) {
            fprintf(stderr, "Can't fork, exiting...\n"); 
            exit(EXIT_FAILURE);   
    }

    close(fd[0]);
    close(fd[1]);

    waitpid(pid1, NULL, 0);
    waitpid(pid2, NULL, 0);
    waitpid(pid3, &status, 0);

    exit(status);

    return 0;
}

pid3无法执行。我试图在pid3中创建dup2fd[1],1,但这不起作用。pid3上应该有什么使其工作,以及如何使用dup2发出3个以上的命令?

您必须设置两个管道-一个用于将cat连接到awk,另一个用于将awk连接到头部


另外,不要关闭您实际需要的文件描述符,例如第一个fork中的fd[0]

您已经创建了一个管道。一根管子有两端。两个端点对于两个过程来说就足够了。如果在一个管道中有三个进程,则需要两个管道。中间的过程保持在两个管道上,另外两个过程保持在剩余的末端。 请看这张图片:

 cat | awk | head

看到两个管道符号了吗?它们是您需要的两个管道。

您期望的结果是什么?你观察到了什么?丢失数据似乎是一个解决办法-: