首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在C中使用叉和管道执行控制台命令

无法在C中使用叉和管道执行控制台命令
EN

Stack Overflow用户
提问于 2013-11-27 15:55:14
回答 2查看 472关注 0票数 1

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

猫log.txt| awk '{打印$7 }‘\\ head -10

但是第三个命令不能在两个礼物中工作。以下是我所做的

代码语言:javascript
运行
复制
#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无法执行。我试图在dup2(fd1,1)中使用pid3,但这是行不通的。pid3上应该做什么才能使其工作,以及如何使用dup2生成多于3个命令?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-27 16:10:43

你创造了一个管道。一根管子有两头。两个过程的两端都足够了。如果三个进程全部位于一个管道中,则需要两个管道。中间的过程保持在两个管道上,另外两个过程保持在剩余的末端上。

看看这幅画:

代码语言:javascript
运行
复制
 cat | awk | head

看到两个管道符号了吗?这是你需要的两根管子。

票数 0
EN

Stack Overflow用户

发布于 2013-11-27 16:07:49

您必须设置两个管道-一个用于连接catawk,另一个用于连接awkhead

另外,不要关闭实际需要的文件描述符(比如第一个叉子中的fd[0]!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20247095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档