Я смотрю, как воссоздать что-то вроде команды linux wall
.
что-то вроде echo "Hello world" | wall
echo "Hello world" | wall
Это отправляет сообщение всем пользовательским оболочкам.
В каталоге /dev/pts/
есть несколько каналов для записи в оболочки пользователей. Так что довольно легко сделать что-то вроде...
#include <fstream>
int main() {
std::ofstream wall("/dev/pts/2");
wall << "hello world" << std::endl;
return 0;
}
Проблема в том, что /dev/pts/*
имеет фид для каждой открытой оболочки (pts/2, pts/3,...), есть ли более общий способ сделать это, или мне придется перечислить все фиды в /dev/pts/
отправить сообщение каждому пользователю из кода C++?
Примечание. Не использовать системный вызов.
Вам нужно будет перечислить все поля (если вы не собираетесь использовать системный вызов). Это можно сделать так:
#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";
}
}