2013-05-06 200 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