결국에는 어떤 값들을 처리해주고(tty 관련) 정도의 차이지
버퍼링 되는 것은 동일하고, 생각만큼 큰 차이는 없다고 한다.
일단 테스트 해본결과, canonical 입력의 우선순위가 더 높아 보였다.
위의 소스는 넌블러킹 모드로 하나의 문자를 받는 예제이다.
테스트 방법은
PC 1. 하이퍼터미널로 연결
PC 2. minicom 으로 연결
PC 2. 터미널에서 특정 포트 출력 (echo test string > /dev/ttyS0)
PC 2. 터미널에서 위의 프로그램 실행
테스트 1.
두개의 PC를 시리얼로 연결해 놓은 상태(canonical mode?)에서 다른 터미널에서
echo test string > /dev/ttyS0
명령을 수행하여 출력 :: 시리얼을 연채로 똑같은 포트를 또 열어서 출력 가능 함
(둘다 canonical mode로 추측됨)
테스트 2.
non-canonical mode로 터미널에서 키를 입력 받는 위의 소스코드를 실행하여,
원격지에서 하이퍼터미널로 키 입력을 받는지 테스트 함.
두개만 있을때에는 이상없이 작동
테스트 3.
테스트 2 상황에서 minicom을 실행시킴
이런식으로 에러가 발생하고 키를 입력 받을 수 없음.
테스트 4.
위의 상황에서 minicom 종료 함.
이상없이 메시지 받을 수 있음.
테스트 5.
반대로 minicom을 구동한 상황에서 소스코드를 실행시킴
메시지를 받을 수 없음 (minicom 쪽이 우선적으로 메시지 받을 수 있음)
테스트 6.
한 바이트씩 받지 않고 10바이트씩 받는 테스트,
하이퍼터미널에 10글자 정도의 문장을 복사하여 한번에 붙여 넣었는데 10글자를 한번에 받지 못하고
이상하게 받아 들이게 됨. non-blocking 에서는 되도록이면 한 문자씩 버퍼에 받아야 할 듯 함.
결론: canonical 입력은 non-canonical 보다 우선적으로 받을 수 있는 것으로 보임.
캐노니컬 / 넌캐노니컬과는 상관없이 블러킹 / 넌-블러킹 연관이고
블러킹이 넌-블러킹 보다 우선적으로 보내고/받을 수 있는 것으로 보임.
[링크 : http://stackoverflow.com/questions/358342/canonical-vs-non-canonical-terminal-input]
버퍼링 되는 것은 동일하고, 생각만큼 큰 차이는 없다고 한다.
일단 테스트 해본결과, canonical 입력의 우선순위가 더 높아 보였다.
#include "stdio.h" #include "fcntl.h" #include "sys/types.h" #include "sys/stat.h"
void main() { char buf; // char buf[16]; int fd, ret;
fd = open("/dev/ttyS0", O_NOCTTY | O_NONBLOCK | O_RDWR); printf("fd[%08X]\n",fd);
while(1) { ret = read(fd, &buf, 1); // ret = read(fd, &buf, 10); if(ret > 0) printf("ret[%d] buf[%s]\n",ret,buf); }
}
위의 소스는 넌블러킹 모드로 하나의 문자를 받는 예제이다.
테스트 방법은
PC 1. 하이퍼터미널로 연결
PC 2. minicom 으로 연결
PC 2. 터미널에서 특정 포트 출력 (echo test string > /dev/ttyS0)
PC 2. 터미널에서 위의 프로그램 실행
sdfasfsadfsadfasfasfasfasfsadf CTRL-A Z for help |115200 8N1 | NOR | Minicom 2.3 | VT102 | Online 00:15 |
ret[-1] buf[▒] ret[-1] buf[▒] ret[-1] buf[▒] ret[-1] buf[▒] ret[-1] buf[▒] ret[-1] buf[▒] ret[-1] buf[▒] ret[-1] buf[▒] ... fd[00000003] ret[1] buf[i] ret[1] buf[ ] ret[1] buf[a] ret[1] buf[m] ret[1] buf[ ] ret[1] buf[a] ret[1] buf[ ] ret[1] buf[b] ret[1] buf[o] ret[1] buf[y] ... ret[8] buf[this is ] ret[10] buf[test strin] ret[2] buf[g st strin] |
테스트 1.
두개의 PC를 시리얼로 연결해 놓은 상태(canonical mode?)에서 다른 터미널에서
echo test string > /dev/ttyS0
명령을 수행하여 출력 :: 시리얼을 연채로 똑같은 포트를 또 열어서 출력 가능 함
(둘다 canonical mode로 추측됨)
테스트 2.
non-canonical mode로 터미널에서 키를 입력 받는 위의 소스코드를 실행하여,
원격지에서 하이퍼터미널로 키 입력을 받는지 테스트 함.
두개만 있을때에는 이상없이 작동
테스트 3.
테스트 2 상황에서 minicom을 실행시킴
ret[-1] buf[▒] |
테스트 4.
위의 상황에서 minicom 종료 함.
이상없이 메시지 받을 수 있음.
테스트 5.
반대로 minicom을 구동한 상황에서 소스코드를 실행시킴
메시지를 받을 수 없음 (minicom 쪽이 우선적으로 메시지 받을 수 있음)
테스트 6.
한 바이트씩 받지 않고 10바이트씩 받는 테스트,
하이퍼터미널에 10글자 정도의 문장을 복사하여 한번에 붙여 넣었는데 10글자를 한번에 받지 못하고
이상하게 받아 들이게 됨. non-blocking 에서는 되도록이면 한 문자씩 버퍼에 받아야 할 듯 함.
결론: canonical 입력은 non-canonical 보다 우선적으로 받을 수 있는 것으로 보임.
캐노니컬 / 넌캐노니컬과는 상관없이 블러킹 / 넌-블러킹 연관이고
블러킹이 넌-블러킹 보다 우선적으로 보내고/받을 수 있는 것으로 보임.
[링크 : http://stackoverflow.com/questions/358342/canonical-vs-non-canonical-terminal-input]
'Linux' 카테고리의 다른 글
Fedora / Gnome 시스템의 실행 프로그램 목록 (0) | 2009.07.01 |
---|---|
*** glibc detected *** : corrupted double-linked list: *** (0) | 2009.06.29 |
리다이렉션 관련 옵션(?) (0) | 2009.06.19 |
콘솔 메시지 막기 / 시리얼 포트로 콘솔 메시지 출력하기 (0) | 2009.06.19 |
/dev/console은 어떻게 열릴까? (0) | 2009.06.19 |