[img:20xit8wm]http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Televideo925Terminal.jpg/330px-Televideo925Terminal.jpg[/img:20xit8wm]
(이 이미지는 wikimedia에 public domain image로 표기되어 있습니다)
(이미지가 들어있는 page : [url:20xit8wm]http://en.wikipedia.org/wiki/TeleVideo[/url:20xit8wm])
아직도 stty가 필요한 경우가 있나 보네요. 질문하신 글을 읽어보니, 뭔가 개념에 오해가 있으신 것이 아닌가 하는 생각이 들었습니다. 물론 저도 실력이 짧다보니 틀릴지 모릅니다. 감안하세요. 또한, 잘 아시는 분이 제가 틀린 것을 발견하시면, 지적해서 고쳐주세요.
우선, stty라는 프로그램이 탄생한 배경이 되는 터미널이란 것이 무었인가부터 이해하셔야 합니다. 위 그림은 1982년에 판매된 텔레비디오 터미널입니다. 여담으로, 텔레비데오는 미국 실리콘 밸리에서 성공한 최초의 한국인이라고 불리우는 황규빈 님이 설립하셨던 1980년대에 잘나갔던 회사입니다. 아무튼… 위 사진을 보면, 마치 구형 PC 같지요? 그러나 PC가 아닙니다. 쉽게 말해서 Ubuntu에 있는 터미널 프로그램 (예: 그놈 터미널) 한 개만 있는 PC라고 생각하셔도 좋습니다. 즉, 기능이라곤 키보드에서 입력하면 저 기계 뒤에 있는 연결 단자를 통하여 컴퓨터 본체로 키의 부호 (통상 ASCII 코드)를 전송하고, 본체가 문자 코드 (통상 ASCII 코드)를 보내주면, 그 문자를 스크린에 보여 줍니다. 단지 그것 뿐입니다. 키보드의 문자를 컴퓨터 본체로 보내고, 본체가 보내준 문자를 스크린에 보여주는 아주 단순한 일을 하는 기계가 그것입니다.
우분투에 들어 있는 그놈-터미널은? 똑같습니다. 사용자가 키보드를 치면, 그 키보드에 해당하는 코드를 연결 단자를 통하여 본체에 보내고, 본체가 보내준 문자를 화면에 보여줍니다. 기본적으로는 그것뿐입니다. 단, 그놈 터미널은 본체와 터미널이 같은 기계에 들어 있을 수도 있고 다른 기계일 수도 있습니다. 또한 연결 단자 보다는 인터넷 연결을 통해서 보내죠?
stty는 왜 필요할까요? 이 프로그램은 그놈 터미널이 연결된 컴퓨터의 터미널 포트 기능을 "설정"하는 프로그램입니다. 네, "설정"하는 프로그램입니다. 터미널의 기능을 하는 것은 그놈터미널 프로그램이며, stty는 설정 프로그램입니다. 무었을 설정하는지는 "stty -a", "man stty"하면 볼 수 있습니다. 하나의 예를 들죠. 제가 안드로이드 태블릿에서 터미널 프로그램을 이용하여 우분투 서버에 접속하면 문자를 입력할 수는 있는데, 입력한 문자를 지울 수가 없더군요. 왜냐하면, 문자를 지우는 것이 우분투 서버에서는 ^H (혹은 backspace 키)로 설정되어 있는데, 안드로이드 터미널 프로그램에서는 backspace 키가 없고 DEL 키가 backspace 기능으로 사용되고 있었습니다. 그래서 맞지 않는 것입니다. 안드로이드 탭의 터미널에서 입력했던 문자를 지우려고 DEL 키를 누르니, DEL 키에 해당하는 부호가 우분투 서버로 넘어가는데 우분투 서버는 ^H를 주어야 지우도록 되어 있으니, 될 리가 없는 것이죠.
stty는 이와 같이 터미널 (안드로이드 태블릿 터미널)의 설정과 컴퓨터 본체 (우분투 서버)의 터미널 설정이 다를 때, 본체 터미널 포트의 설정을 터미널에 맞추어주는 "설정" 도구입니다. 위 경우에는 "stty erase DEL"과 같이 해 주면, erase (문자 지우기) 기능이 DEL 키를 이용하여 이루어지게 됩니다. (DEL의 부호는 사실은 ^?입니다.) 다시 한번 말씀 드립니다. stty는 컴퓨터 본체의 터미널 포트 (예: /dev/ttya) 설정을 바꾸어서, gnome-terminal과 같은 터미널 프로그램 (혹은 터미널)이 본체와 같이 잘 동작하도록 해 주는 프로그램입니다. 따라서 stty는 설정을 바꿀 뿐, susp/intr/stop/start 등의 동작과는 직접적인 관계가 없습니다. 그 동작은 터미널 프로그램 (gnome-terminal)과 그 프로그램 안에서 실행되고 있는 bash가 맡고 있는 일입니다.
susp/intr와 stop/start가 동작하는 방식도 차이가 있습니다. stop/start부터 설명 드리죠. 이것이 더 간단하거든요. 이것들은 한마디로 말하여 terminal program이 담당합니다. 사용자가 cntrl+s를 키보드에서 치면, 터미널 프로그램이 받아서 화면을 정지시킵니다. (stop 동작입니다) 화면이 정지되면 bash shell 안에서 돌아가던 프로그램도 출력이 불가능하므로 정지 (sleep status)로 들어갑니다. cntrl+q를 주면 터미널 프로그램이 화면을 풀어줍니다. 화면이 풀렸으니 출력이 가능해지고 따라서, bash shell 안에서 실행되던 프로그램이 깨어나서 계속 실행됩니다. (start 동작입니다)
susp/intr의 경우 조금 더 복잡한 과정을 거칩니다. 이것들은 bash가 담당합니다. ^Z를 키보드에서 주면 suspend가 되고, ^C를 주면 intrrupt가 되죠? 동작의 결과는 다르지만, 그들이 동작하는 방식은 같습니다. 한마디로 말해서 UNIX (혹은 UNIX-like OS)의 "signal"이라는 방법을 이용하여 처리합니다. 즉, 사용자가 키보드에서 ^C (혹은 ^Z)를 치면, gnome-terminal이 이 키에 해당하는 부호를 bash에 넘깁니다. 그러면, bash가 bash 내에서 현재 실행되고 있는 program에 signal을 보냅니다. 여기서 signal이란 사용자가 ^C (혹은 ^Z)를 쳤다는 정보를 보내는 것입니다. 이 정보를 SIGINT (혹은 SIGSTOP)이라고 부릅니다. bash에서 실행되고 있는 signal을 받은 program은 이 program의 programmer가 이 signal을 받았을 때 실행 하도록 프로그램한 동작을 합니다. 만약 프로그래머가 signal을 받았을 때 취할 동작에 관한 프로그램을 준비하지 않았으면, glibc (C library)에 준비된 동작을 합니다. ^C (SIGINT)의 경우, 프로그램을 끝내는 것이 glibc에 준비된 동작이며, ^Z (SIGSTOP)의 경우 실행하고 있는 program을 정지 시키는 (stopped process로 만드는) 것이죠.
도움이 되셨길 바랍니다. 혹시 signal에 대한 자세한 내용이 필요하시면, Google에서 "signal"과 "ipc"의 두 단어로 검색하시면 좋은 글이 많이 나옵니다.