Description

dsh(server)

  • 명령을 입력받고 terminal에게 전송하는 역할을 하는 쓰레드와, 각 소켓에 연결되어 실행 결과를 받아오는 쓰레드들이 있다.
  • 새로운 클라이언트들이 연결될 때 마다 Linked list에 임의로 생성한 ID와 해당하는 소켓의 file descriptor를 저장해둬야 한다.
  • 실행 중에 dsh에서 특정 문자를 보내면 terminal의 명령어 실행을 종료시킬 수 있어야 한다.
  • 유저가 Ctrl+C를 누르면 원하는 terminal을 선택할 수 있어야 한다.
  • Ctrl+C를 눌렀을 때 다른 terminal의 실행 결과를 출력하는 것을 멈춰야 한다. (terminal은 계속해서 결과를 보내고 있어야 한다.)
  • dsh를 종료시키면 연결되어 있는 모든 socket과의 연결을 안전하게 끊어야 한다.

terminal(clients)

  • dsh의 명령어를 계속 listen하는 쓰레드와, 받아온 명령어를 실행하는 쓰레드가 있다.
  • 실행중인 명령이 없는데 dsh로부터 명령어가 오면 해당 명령어를 실행하도록 한다.
  • 실행중인 명령이 있는데 dsh로부터 다른 명령어가 왔을 경우 무시하도록 한다.
  • 실행중인 명령이 있는데 dsh로부터 그 실행을 종료하라는 명령이 왔을 경우 명령을 실행중인 프로세스를 종료한다.
  • 명령어를 실행하는 쓰레드는 새로운 프로세스를 fork()하여 excevp()를 사용해 명령어를 실행하고, parent process가 그 결과를 pipe를 통해 받아온다.
  • pipe를 통해 실행 결과를 읽으며 자신의 화면에 출력하고 dsh에 전송한다.

more…

  • Global mode: 하나의 terminal이 아닌, 연결된 모든 terminal들에게 명령을 실행시킬 수 있도록 한다.
  • 현재는 socket file descriptor를 해당 termina의 ID로 사용하고 있는데, 임의로 ID를 만들어줘도 좋을 것 같다.


TIL

  • dsh(server)쪽을 구현하는 데 어려움이 있었다. lock과 conditional variable을 활용하는데 deadlock의 늪에 빠져 한참을 헤맸고 사실 아직도 해결하지 못한 상황이다. 여러 쓰레드가 pararell하게 돌아갈 때 일어날 수 있는 상황들에 대한 이해와, 어떻게 해야 안전하게 내가 원하는 기능을 구현할 수 있을지에 대한 감이 아직 많이 부족하다는 것을 느꼈다.
  • 비록 해결 방법은 아직 찾지 못했지만 프로그램의 흐름을 차근차근 짚어가며 문제가 생길 수 있는 부분들을 몇 가지 찾아냈다. multi-threads 프로그램을 짤 때는 프로그램이 실행될 때 일어날 수 있는 모든 가능성들을 더욱 꼼꼼히 확인해야겠다는 것을 느꼈다.


느낀점 - 10일간의 System Programming Study를 마무리하며

  • 10일의 스터디를 하는 동안 star(simple tar), 간단한 채팅 서버, fshare 1.0과 2.0버전 (simple file sharing system), 그리고 마지막 dshell까지 다섯개의 과제를 해결해 보았다. 물론 모두 완벽하게 완성된 상태는 아니지만 “지금까지 배운 것을 활용해 이런 것들을 만들 수 있구나” 라는 생각에 즐거웠다.
  • 마지막 과제 dsh에서 해결하지 못한 부분이 아직도 마음에 걸린다. 꼭 해결해서 원하는 기능을 안전하게 구현하고 싶다..! 다만 고민은 조금 많이 해봐야 할 것 같다 😅
  • 프로그래밍을 하는 동안 뭔가 막히거나, 내가 설계한 방향이 괜찮은지 확신이 서지 않거나, 무언가를 놓치고 있을 때 편하게 물어보고 함께 고민해볼 수 있는 팀원들이 있어서 정말 좋았다. 여러 사람이 함께 고민했을 때 혼자서는 발견하지 못했을 프로그램의 약점이나 간과한 시나리오 등을 발견할 수 있었던 적이 한두번이 아니었다. 문제를 이해한 정도도 서로 다르니 각자 이해가 부족한 부분을 채워가며 문제를 해결해나갈 수 있었다.
  • 무엇보다, 막막해보이는 문제가 있을 때 그 문제를 쪼개가며 한 단계씩 해결해 나가면 언젠가는 목표에 도달할 수 있다는 것과, 그 과정 하나하나가 정확히 구현되고 있는지를 다양하게 테스트하고 확실히 체크하며 넘어가는 것이 중요하다는 것을 알게 되었다. 나중에 무엇이 문제인지 한참 찾으며 헤매는 것 보다 미리미리 착실하게 단계를 밟아가는 것이 훨씬 낫다!