Как передать файл назад и вперед между родителями и детьми, используя pipe - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь открыть файл с родителем, затем отправить его ребенку.Я хочу, чтобы ребенок искал определенное слово и отправил строку из текстового файла обратно родителю.

С моим Кодом прямо сейчас я могу отправить текстовый файл детям, но я не могу проверить файл иотправить его обратно родителю.

int fd[2];
pid_t cpid;

pipe(fd);
if ((cpid = fork()) == -1)
{
    cout << "ERROR" << endl;
    exit(1);
}

// child process
if (cpid == 0)
{
    // don't need the write-side of this
    close(fd[WRITE_FD]);

    std::string s;
    char ch;
    while (read(fd[READ_FD], &ch, 1) > 0)
    {
        if (ch != 0)
            s.push_back(ch);
        else
          {
            //std::cout << s << " "; //'\n'; //print the txt
            while(getline(s, ch, '.'))
            {
              printf("%s\n", toSend.c_str());
            }
            s.clear();
          }
    }

    // finished with read-side
    close(fd[READ_FD]);
}

// parent process
else
{
    // don't need the read-side of this
    close(fd[READ_FD]);

    fstream fileWords ("words.txt");
    string toSend;
    while (fileWords >> toSend)
    {
        // send word including terminator
        write(fd[WRITE_FD], toSend.c_str(), toSend.length()+1);
    }

    // finished with write-side
    close(fd[WRITE_FD]);
    wait(NULL);
}
return EXIT_SUCCESS;

1 Ответ

0 голосов
/ 20 октября 2018

Трубы предназначены для однонаправленной связи.Если вы попытаетесь использовать канал для двунаправленной связи, то почти наверняка программы в конечном итоге будут читать свой собственный вывод обратно (или подобное нежелательное поведение), а не успешно взаимодействовать друг с другом.Есть два аналогичных подхода, которые будут работать для двунаправленной связи:

  1. Создайте два канала и дайте каждому процессу конец чтения одного и конец записи другого.Тогда нет никакой двусмысленности относительно того, где данные будут заканчиваться.
  2. Используйте сокет вместо канала.Функция socketpair делает это простым: просто наберите socketpair(AF_UNIX, SOCK_STREAM, 0, fd) вместо pipe(fd).Сокеты работают так же, как каналы, но являются двунаправленными (записи в один из FD всегда читаются другим FD).
...