Вначале я кратко объясню свою программу, затем перейду к моему вопросу. Я создал двунаправленную трубу, которая выполняет следующее:Передача содержимого файла через двунаправленную трубу
- Родительский процесс переходит строковое значение дочернего процесса (в моей программе строковое значение «TEST DATA»)
- дочерний процесс читает пропущенный данные из его родителя и выполняет файл python, который просто соединяет две строки вместе (строка, полученная из родительского процесса «TEST DATA» с «CHILD PROCESS:»)
Прилагаемые строки отправляются обратно в родительский процесс, который просто распечатывает их.
- после выполнения этой программы, то выход будет выглядеть следующим образом:
родительский процесс: РЕБЕНОК ПРОЦЕСС: ТЕСТ 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) я хочу отправить содержимое всего текстового файла. Любые подсказки?
Что именно дает вам проблему? Если вы знаете, как отправить текст, как отправить другой файл? Вы знаете, как читать данные из файла? – SergeyA
Функция «запись» принимает только строковые значения в качестве второго параметра. Я не уверен, как передать содержимое файла дочернему процессу @sergeyA. Если сначала невозможно прочитать содержимое файла, используйте цикл для отправки каждой строки отдельно? – Maya
Ты прибил его! В цикле вы можете прочитать строку из файла и передать эту строку через канал. – SergeyA