【问题标题】:C piping using the command line arguments使用命令行参数的 C 管道
【发布时间】:2014-03-20 23:20:49
【问题描述】:

我需要一些帮助来模拟“|” unix 中的命令。我需要能够将第一个参数的输出用作第二个参数的输入,例如 ls 等等。到目前为止我得到了这段代码,但我只是停留在这一点上。任何和所有的帮助都会有所帮助。-谢谢。

#include <sys/types.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char ** words)
{ 
  char** args;
  char *cmd1[2] = { words[1], 0 };
  char *cmd2[2] = { words[2], 0 };
  int colon, arg1 ,i, pid, status;
  int thepipe[2];
  char ch;
  args = (char **) malloc(argc*(sizeof(char*)));
  colon = -1;
  for (i=0;(i<argc); i=i+1){
    if (strcmp(words[i],":") == 0) {
      colon = i;
    }
    else {}
  }
  pipe(thepipe);
  arg1 = colon;
  arg1 = arg1 - 1;
  for (i=0;(i<arg1); i=i+1){
    args[i] = (char*) (malloc(strlen(words[i+1])+1));
    strcpy(args[i], words[i+1]);
  }
  args[argc] = NULL;
  pid = fork();
  if (pid == 0) {
    wait(&pid);
    dup2(thepipe[1], 1);
    close(thepipe[0]);
    printf("in new\n");
    execvp(*args, cmd1); 
  }
  else {
    close(thepipe[1]);
    printf("in old\n");
    while ((status=read(thepipe[0],&ch,1)) > 0){
    execvp(*args, cmd2);
    }
  }

}

【问题讨论】:

  • 你找错树了。这不是程序级实用程序,而是 bash 本身执行此操作。
  • 我明白,但我需要在不使用“|”的情况下复制它。
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。您是否查找过相关问题。 SO 13636252 C Minishell Adding Pipelines 可能是相关的;其他几百人也可能如此。您应该丢失else {} 行。
  • man dup2 您需要将标准输入/标准输出与管道的相应端相关联。
  • @ciphermagi - 这是标准的第一年作业。

标签: c input fork output piping


【解决方案1】:

假设argv[1]是一个单字命令(如ls),argv[2]是第二个单字命令(如more),那么:

家长

  1. 创建管道。
  2. 分叉第一个孩子。
  3. 叉二胎。
  4. 关闭管道的两端。
  5. 父母等待两个孩子都死去,报告他们的退出状态,然后自行退出。

孩子 1

  1. 将管道的写端复制到标准输出。
  2. 关闭管道的两端。
  3. 使用execvp() 运行argv[1] 中的命令。
  4. 退出,可能带有写入标准错误的错误消息(如果 execvp() 返回)。

孩子 2

  1. 将读取的管道末端复制到标准输入。
  2. 关闭管道的两端。
  3. 使用execvp() 运行argv[2] 中的命令。
  4. 退出,可能带有写入标准错误的错误消息(如果 execvp() 返回)。

唯一剩下的技巧是你需要创建一个向量,例如:

char cmd1[2] = { argv[1], 0 };
char cmd2[2] = { argv[2], 0 };

作为第二个参数传递给execvp()


请注意,此大纲不会破坏字符串。如果你想处理一个调用,例如:

./execute "ls -la" "wc -wl"

然后您需要将每个参数拆分为单独的单词并为cmd1cmd2 创建更大的数组。如果要处理两个以上的命令,则需要仔细考虑如何管理管道中的额外阶段。第一个和最后一个命令与中间的不同(因此 3 个进程具有三种不同的机制,但 4 个或更多进程基本上一遍又一遍地使用相同的机制,除了第一个和最后一个命令)。

【讨论】:

  • 所以我需要创建另一个子进程才能让它工作?
  • 视情况而定;你可以让它与一个孩子一起工作。指令有点混乱(你没有父母在等待孩子),所以唯一的父母步骤是“创建管道”并分叉第一个孩子。第一个子指令不变;然后父进程执行第二个子指令。
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 2012-04-08
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多