【问题标题】:Can't execute console commands in C with fork and pipe无法使用 fork 和管道在 C 中执行控制台命令
【发布时间】:2013-11-27 15:55:14
【问题描述】:

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

猫日志.txt| awk '{ 打印 $7 }' |头 -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 中制作 dup2(fd[1], 1) ,但这不起作用。 pid3 上应该有什么才能使其工作以及如何使用 dup2 发出 3 个以上的命令?

【问题讨论】:

  • 您的预期结果是什么?你观察到了什么?
  • 丢失useless use of cat 似乎是一种解决方法 (-:

标签: c linux bash fork pipe


【解决方案1】:

您已经创建了一个管道。一根管子有两端。两个末端对于两个过程就足够了。如果您在一个管道中有三个进程,则需要两个管道。中间的进程保留在两个管道上,另外两个进程保留在剩余的两端。

看这张图:

 cat | awk | head

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

【讨论】:

    【解决方案2】:

    您必须设置两条管道——一条将cat 连接到awk,另一条将awk 连接到head。

    另外,不要关闭你真正需要的文件描述符(例如fd[0] 在你的第一个 fork 中!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 2022-11-13
      • 2021-06-04
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2016-05-20
      相关资源
      最近更新 更多