2013-05-06 197 views
0

我想用C实现这个linux命令。切-b 1在linux中使用管道使用父进程和子进程

我试图做到这一点是

调用的ls -l的父进程 将LS的输出-l以文件的方式(写入文件)

呼吁削减子进程 读取文件(一个写入父进程) 实行切削到文件 打印输出

这是远远我所做的

/* pipe.c */ 
#include <sys/wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

void main() 
{ 
    int filedes[2]; 
    int p; 
    pid_t pid, pid1; 
    p=pipe(filedes); 
    FILE *stream; 
    char buff[20]; 

    printf("pipe command returns %d, %d ,%d\n",p, filedes[0],filedes[1]); 

    if(pipe(filedes) == -1) /* Create the pipe */ 
     printf("error pipe"); 
     pid1=fork(); 
     pid=getpid(); 
     switch (pid1) { /* Create a child process */ 
     case -1: 
     printf("error fork"); 
     case 0: /* Child */ 
     /* Close unused write end */ 
     /* Child can now read from pipe */ 
     if (close(filedes[1]) == -1) 
      printf("error close"); 
     printf("I am a child process pid %d, and will read from pipe\n",pid); 

     while (read(filedes[0], &buff, 1) > 0) 
      write(STDOUT_FILENO, &buff, 1); 

     write(STDOUT_FILENO, "\n", 1); 
     close(filedes[0]); 
     _exit(EXIT_SUCCESS); 

     break; 

     default: /* Parent */ 
     /* Close unused read end */ 
     /* Parent can now write to pipe */ 
     if (close(filedes[0]) == -1) 
      printf("error close"); 
     printf("I am the parent process pid %d, and will write to pipe\n", pid); 
     stream = fdopen(filedes[1], "w"); 
     strcpy(buff, "This is a test\n"); 
     write(filedes[1], buff, strlen(buff)); 

     char *args[80]; 
     args[0] = "ls"; 
     args[1] = "-l"; 
     args[2] = NULL; 
     execvp(args[0],args); 

     int bak, new; 
     bak = dup(1); 
     new = open("/home/urwa/abc.txt", O_WRONLY); 
     dup2(new, 1); 
     close(new); 



     close(filedes[1]);   /* Reader will see EOF */ 
     wait(NULL);    /* Wait for child */ 
     exit(EXIT_SUCCESS); 

     break; 
    } 
} 

这段代码工作得很好。并在展台上打印输出测试语句。以及ls -l输出。但该文件是空的。我究竟做错了什么。 我也试过freopen如下..仍然是空文件。 :/

FILE *fp; 
fp = freopen ("/temp/abc.txt", "a+", stdout); 

回答

0

您没有在子节点中调用切入点,并且文件描述符也在这里混淆了。

为了执行,你必须任务关闭父的stdout和execvp前在父母写端标准输出。在孩子中,您必须小孩的附近标准杆,并在execvp之前将读取结束为标准杆给您的孩子。以这种方式your parent's stdout is stdin of your child(创建管道B/W两个)。

int main() 
{ 
    int filedes[2]; 
    int p; 
    pid_t pid = 0, pid1 = 0; 
    p=pipe(filedes); 
    FILE *stream; 
    char buff[20]; 
    char *args[80]; 

    printf("pipe command returns %d, %d ,%d\n",p, filedes[0],filedes[1]); 

    if(pipe(filedes) == -1) /* Create the pipe */ 
     printf("error pipe"); 
     pid1=fork(); 
     pid=getpid(); 
     switch (pid1) { /* Create a child process */ 
     case -1: 
     printf("error fork"); break; 
     case 0: /* Child */ 
     /* Close unused write end */ 
     /* Child can now read from pipe */ 
     if (close(filedes[1]) == -1) 
      printf("error close"); 
     printf("I am a child process pid %d, and will read from pipe\n",pid); 

     close(0); //close stdin of child 
     dup(filedes[0]); //make pipes read end stdin of child 

     args[0] = "cut"; 
     args[1] = "-b"; 
     args[2] = "1"; 
     args[3] = NULL; 
     execvp(args[0],args); 
     break; 

     default: /* Parent */ 
     /* Close unused read end */ 
     /* Parent can now write to pipe */ 
     if (close(filedes[0]) == -1) 
      printf("error close"); 
     printf("I am the parent process pid %d, and will write to pipe\n", pid); 

     close(1); //close stdout 
     dup(filedes[1]); //make write end of pipe stdout of parent 
     args[0] = "ls"; 
     args[1] = "-l"; 
     args[2] = NULL; 
     execvp(args[0],args); 
     break; 
    } 
} 
+0

非常感谢您的帮助 – urwaCFC 2013-06-11 16:09:35