2013-11-27 30 views
1

我努力让自己在C,其执行控制台shell命令不能用C叉和管

猫log.txt的程序执行控制台命令| awk'{print $ 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个命令?

+0

你的预期结果是什么?你观察到什么? – HAL

+0

失去[无用的'cat'](http://partmaps.org/era/unix/award.html)似乎是一个解决方法( - : – tripleee

回答

0

你已经创建了一个管道。一根管子有两端。两端足够两个进程。如果你在一个管道中有三个进程,你需要两个管道。中间的过程保持在两个管道上,另外两个过程保持在其余的端点上。

看看这张图:

cat | awk | head 

看到两个管道符号?他们是你需要的两个管道。

0

您必须设置两个pipes--一个cat连接到awk和一个awk连接到head

另外,不要认为你确实需要密切文件描述符(如fd[0]在你的第一个叉!)