Отправка сообщений всем пользователям с помощью fstream

0

Я смотрю, как воссоздать что-то вроде команды 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++?

Примечание. Не использовать системный вызов.

Теги:
debian
fstream

1 ответ

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";
    }
}
  • 0
    Вау, это действительно элегантное решение. Намного проще, чем я думал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню