如何使用管道在父子之间来回传递文件

时间:2018-10-15 00:16:04

标签: c++ pipe fork

我正尝试与父级打开文件,然后将其发送给子级。我希望孩子寻找特定的单词并将行从文本文件发送回父母。

现在使用我的代码,我可以将文本文件发送给孩子,但是我无法检查该文件并将其发送回父母。

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 :(得分:0)

管道用于单向通信。如果您尝试使用管道进行双向通信,则几乎可以肯定,程序最终将把自己的输出读回自己(或类似的不良行为),而不是成功地相互通信。有两种类似的方法可用于双向通信:

  1. 创建两个管道,并为每个进程提供一个读端和另一个进程的写端。这样一来,数据将在何处结束就没有歧义。
  2. 使用插座代替管道。 socketpair函数使此操作变得容易:只需用socketpair(AF_UNIX, SOCK_STREAM, 0, fd)代替pipe(fd)。套接字的工作方式与管道一样,但是是双向的(对FD的写入总是被另一个FD读取)。