2015-12-31 7 views
4

Вначале я кратко объясню свою программу, затем перейду к моему вопросу. Я создал двунаправленную трубу, которая выполняет следующее:Передача содержимого файла через двунаправленную трубу

  1. Родительский процесс переходит строковое значение дочернего процесса (в моей программе строковое значение «TEST DATA»)
  2. дочерний процесс читает пропущенный данные из его родителя и выполняет файл python, который просто соединяет две строки вместе (строка, полученная из родительского процесса «TEST DATA» с «CHILD PROCESS:»)
  3. Прилагаемые строки отправляются обратно в родительский процесс, который просто распечатывает их.

    • после выполнения этой программы, то выход будет выглядеть следующим образом:

родительский процесс: РЕБЕНОК ПРОЦЕСС: ТЕСТ DATA

и это мой C++ и python:

test.cc:

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/wait.h> 
#include <cstdlib> 

int main() 
{ 
    int writepipe[2] = {-1,-1};// parent -> child 
    int readpipe[2] = {-1,-1};//child -> parent 
    pid_t childpid; 

    if(pipe(readpipe) < 0 || pipe(writepipe) < 0) 
    { 
     //cannot create a pipe 
     printf("error creating pipe"); 
     exit(-1); 
    } 
#define PARENT_READ readpipe[0] 
#define CHILD_WRITE readpipe[1] 
#define CHILD_READ writepipe[0] 
#define PARENT_WRITE writepipe[1] 

    if((childpid=fork())<0) 
    { 
     //cannot fork child 
     printf("cannot fork child"); 
     exit(-1); 
    } 
    else if (childpid==0) 
    {//child process 
     close(PARENT_WRITE); 
     close(PARENT_READ); 
     dup2(CHILD_READ,0); //read data from pipe instead of stdin 
     dup2(CHILD_WRITE , 1);//write data to pipe instead of stdout 
     system("python test.py"); 
     close(CHILD_READ); 
     close(CHILD_WRITE); 
    } 
    else 
    { 
     close(CHILD_READ); 
     close(CHILD_WRITE); 
     //do parent stuff 
     write(PARENT_WRITE,"TEST DATA\n",23); 
     int count; 
     char buffer [40]; 
     count=read(PARENT_READ,buffer,40); 
     printf("parent process: %s",buffer); 
    } 
    return 0; 
} 

test.py:

import sys 
data=sys.stdin.readline() 
sys.stdout.write("CHILD PROCESS: "+data) 

Мой вопрос: У меня есть текстовый файл (позволяет называть его test.txt), который содержит несколько строк данных, и я хочу, чтобы иметь возможность для использования предыдущего кода, но вместо отправки одного строкового значения (TEST DATA) я хочу отправить содержимое всего текстового файла. Любые подсказки?

+1

Что именно дает вам проблему? Если вы знаете, как отправить текст, как отправить другой файл? Вы знаете, как читать данные из файла? – SergeyA

+0

Функция «запись» принимает только строковые значения в качестве второго параметра. Я не уверен, как передать содержимое файла дочернему процессу @sergeyA. Если сначала невозможно прочитать содержимое файла, используйте цикл для отправки каждой строки отдельно? – Maya

+3

Ты прибил его! В цикле вы можете прочитать строку из файла и передать эту строку через канал. – SergeyA

ответ

0

В программе C вам необходимо создать буфер, чтобы прочитать файл, а затем отправить его в трубу. Если буфер меньше файла, вам нужно несколько раз. Труба может не принимать полную запись одним глотком, поэтому вам может потребоваться несколько записей. Обычно это делается с помощью внешнего цикла, который считывает некоторые данные, а затем внутренний цикл, который записывает данные ... затем повторяется до тех пор, пока передача файла не будет выполнена. - tdelaney

Смежные вопросы