결국에는 어떤 값들을 처리해주고(tty 관련) 정도의 차이지
버퍼링 되는 것은 동일하고, 생각만큼 큰 차이는 없다고 한다.
일단 테스트 해본결과, 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을 실행시킴
이런식으로 에러가 발생하고 키를 입력 받을 수 없음.
테스트 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]