使用命令行参数的C管道



我需要一些帮助来模拟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 newn");
    execvp(*args, cmd1); 
  }
  else {
    close(thepipe[1]);
    printf("in oldn");
    while ((status=read(thepipe[0],&ch,1)) > 0){
    execvp(*args, cmd2);
    }
  }
}

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

父母

  1. 创建管道
  2. Fork第一个子进程。
  3. Fork第二个子进程。
  4. 关闭管道两端
  5. 父级等待两个子级死亡,报告他们的退出状态,并退出自己。

子1

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

子2

    将管道的读端复制到标准输入。
  1. 关闭管道两端
  2. 使用execvp()执行argv[2]中的命令。
  3. 退出,可能有一个错误消息写入标准错误(如果execvp()返回)。
剩下的唯一技巧是,您需要创建一个像 这样的向量:
char cmd1[2] = { argv[1], 0 };
char cmd2[2] = { argv[2], 0 };

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


注意,这个大纲并没有把字符串分开。如果您想处理如下调用:

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

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

相关内容

  • 没有找到相关文章

最新更新