将两个命令与管道

时间:2016-04-27 18:10:13

标签: c bash pipe fork

我试图&#34;合并&#34;两个命令在一个(不存在)命令中并管道它。我的意思是..假设您有这两个命令:grep text < file.txt | wc -l > out.txt,可以表示这两个命令的(不存在)命令可能类似于{{1然后将行数输出到out.txt中。基本上这些(grepwc)命令应该具有与(grepwc -l < file.txt)相同但更短的行为。

我试过这样的事情,但我认为我的方法远远不能实现目标。我使用名为commlist的结构,其中包含已由cmd,argc和argv解析的命令。 inputfile和outputfile是open()上使用的文件的路径名。

我使用的结构。

grep text < file.txt | wc -l > out.txt

和代码:

typedef struct command {
char *cmd;              
int argc;               
char *argv[MAXARGS+1];  
struct command *next;
} COMMAND;

完整的代码在这里:

http://pastebin.com/tYGWwUjS

http://pastebin.com/sNJhEg2Y

1 个答案:

答案 0 :(得分:2)

你的方法确实有点过于复杂。这可以通过一个子进程和一个管道来实现(就像在原始shell命令中一样)。我们来看看它:

setDT(df1)[, RatedStudyID :=if(!any(CATMERater==Rated)) NA_integer_
             else StudyID[CATMERater ==Rated], .(Rated, TeamID)]

  • 创建管道
  • 分叉两个流程
  • 使grep写入管道
  • 从管道中读取wc

但是只分叉一个进程就足够了,因为我们不需要返回父进程。这导致以下代码:

grep text < file.txt | wc -l > out.txt

#include <stdlib.h> #include <unistd.h> int main (void) { int fd[2]; pipe(fd); if (fork()) { // Child process dup2(fd[0], 0); // wc reads from the pipe close(fd[0]); close(fd[1]); execlp("wc", "wc", "-l", NULL); } else { // Parent process dup2(fd[1], 1); // grep writes to the pipe close(fd[0]); close(fd[1]); execlp("grep", "grep", "celio", NULL); } exit(EXIT_FAILURE); } 仅在其中一个exit()失败时才会到达。