///
Search
🤔

File System? 야 이걸로 IPC 구현 될 것 같은데?

태그
아이디어
OS

시작 이유

OS 공부하다가 File System관련해서 Hard Link, Symbolic Link를 보고 말았다. 근데 문득 그런 생각이 들었다. ”오? 이거 뭔가 IPC에서 하는거랑 비슷한 느낌인데?” 그런 생각을 하지 말았어야 했는데…

그래서 뭘 만들거냐?

아이디어는 간단하다. 이걸로 process간 통신을 이용해서 다중 채팅 서버를 구현한다.
1.
server는 해당 시스템에 txt File을 2개 만든다. (out, in)
2.
client는 해당 시스템의 server 경로로 접속해서 out, in 파일을 읽고 쓴다.
대충 시작하기 전인데 될까?
시작하기 전엔 client도 만들어야지 했는데, 상당히 귀찮았다. 그래서 그냥 in 파일에 내가 직접 작성하고 콘솔에 찍히는지 확인했다.
package chat; import java.io.*; import java.util.concurrent.CompletableFuture; public class Server { private static final String RESOURCE = "src/main/resources/"; private static final String OUT_FILE_NAME = "out.txt"; private static final String IN_FILE_NAME = "in.txt"; private final BufferedReader BR; private final BufferedWriter BW; public static void main(String[] args) throws FileNotFoundException { Server server = new Server(); CompletableFuture<Void> rd = server.reader(); try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){ while (true){ if (reader.ready()){ server.BW.write(reader.readLine() + "\n"); server.BW.flush(); } } } catch (IOException e) { rd.join(); throw new RuntimeException(e); } } public Server() throws FileNotFoundException { this.BR = new BufferedReader(new InputStreamReader(new FileInputStream(RESOURCE + IN_FILE_NAME))); this.BW = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(RESOURCE + OUT_FILE_NAME))); } private CompletableFuture<Void> reader(){ return CompletableFuture.runAsync(() -> { while (true) { try { if (BR.ready()) { System.out.println(BR.readLine()); BR.reset(); } } catch (IOException e) { } } }); } }
Java
복사

결과 회고

그냥 장난삼아 한번 만들어봤다. 근데 계기 자체는 IPC를 공부하다 어떤 분이 결국 “소켓은 파일이다.” 라는 말을 하셨다. 그러고 File System을 공부하다 보니 HardLink가 그럼 동일한 메모리의 파일을 가르킬 수 있다면 결국 IPC랑 똑같네? 이런 생각을 가지게 되었다. 그래서 아주~~ 간단하게 한번 txt 파일에 읽고 쓰고 하는 걸 만든 것이다. 만약 제대로 만들려고 한다면 여러가지를 고려해야 할 것이다(=읽고 쓸 때 업데이트 문제, 읽은 데이터 삭제, 여러 클라이언트가 접속하는 것이라면 업데이트 시그널). 재미는 있었다. 하지만 깊게 생각하려고 하니 복잡해지니 요까지만 하자.

좀 더 가보면

스프링에서도 비슷하게 xml을 reload하여 사용하는 케이스를 보긴했다. 그런식으로 file을 reload하면 간단한 채팅정도는 메모장으로 서버와 통신할 수 있을 것 같다. 대충 여기에 FileBasedConfigurationBuilder이 친구를 이용하면 될 것 같다. save가 있어서 다시 리로드할 수 있을 것 같다. 끝~