2014-12-28 3 views
0

나는 리눅스 wall 명령과 같은 것을 재 작성하는 방법을 찾고 있습니다.fstream으로 모든 사용자에게 메시지 보내기

뭔가 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/*가 열려있는 각 쉘 에 대한 피드 가지고 있다는 것입니다 ... 그런 짓을하는 것은 매우 쉽습니다, (점/2/3, ... 점) 거기에 더 많은입니다 이 일반적인 방법, 또는 /dev/pts/에있는 모든 피드를 C++ 코드에서 각 사용자에게 메시지를 보내도록 열거해야합니까?

참고 : 시스템 호출을 사용하지 않습니다.

답변

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

와우, 정말 멋진 솔루션입니다. 훨씬 더 간단하다. – MatUtter

관련 문제