我正在研究如何重新创建类似linux wall
命令的东西。
类似于echo "Hello world" | wall
这会向所有用户的shell发送一条消息。
在目录/dev/pts/
中有几个用于写入用户shell的管道。因此,做一些像......这样的事情很容易。
#include <fstream>
int main() {
std::ofstream wall("/dev/pts/2");
wall << "hello world" << std::endl;
return 0;
}
问题是/dev/pts/*
为每个开放的shell (pts / 2,pts / 3,...)提供了一个Feed,是否有更通用的方法来执行此操作,或者我是否必须枚举/dev/pts/
中的所有Feed以从C ++代码向每个用户发送消息?
注意:不使用系统调用。
答案 0 :(得分:3)
您必须枚举所有字段(如果您不打算使用系统调用)。这可以这样做:
#include <fstream>
#include <string>
template <class File>
struct lock_helper // Simple fstream manager just for convenience
{
template<class... Us>
lock_helper(File& file, Us&&... us)
{
file.close();
file.open(std::forward<Us>(us)...);
}
};
int main()
{
std::ofstream out;
for (int i = 2; out; ++i)
{
lock_helper<std::ofstream> lock(out, std::string("/dev/pts/") + std::to_string(i));
out << "Hello, World\n";
}
}