我正尝试与父级打开文件,然后将其发送给子级。我希望孩子寻找特定的单词并将行从文本文件发送回父母。
现在使用我的代码,我可以将文本文件发送给孩子,但是我无法检查该文件并将其发送回父母。
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;
答案 0 :(得分:0)
管道用于单向通信。如果您尝试使用管道进行双向通信,则几乎可以肯定,程序最终将把自己的输出读回自己(或类似的不良行为),而不是成功地相互通信。有两种类似的方法可用于双向通信:
socketpair
函数使此操作变得容易:只需用socketpair(AF_UNIX, SOCK_STREAM, 0, fd)
代替pipe(fd)
。套接字的工作方式与管道一样,但是是双向的(对FD的写入总是被另一个FD读取)。