USB를 통해 컴퓨터로 정보를 보내는 장치가 있습니다. 아치 리눅스라는 이름의 파일을 생성하여이 장치를 설정 ttyUSB0
에서를 /dev/
. I가 사용하고 GTKterm
,이 입력 정보를 수신하고, 에뮬레이트 단자 창에 표시하도록.
내 질문은 GTKterm
이 ttyUSB0
파일 을 어떻게 정확하게 읽고 쓸 수 있으며 비슷한 기능을 구현하는 방법을 어디서 배울 수 있습니까? 즉, 가장 기본적인 형태로,에 문자를 ttyUSB0
쓰거나 반대로 바이트를 받아서 파일에 쓰려면 어떻게해야합니까?
답변
TTY는 다른 것과 마찬가지로 사용할 수있는 파일입니다. 해당 언어의 표준 파일 열기 도구를 사용하여 열어서 읽거나 쓸 수 있습니다. “일반적인”파일과 다른 특수한 동작이 있지만 기본 사항은 동일합니다. 마지막에는 몇 가지 특별한 경우를 다루지 만 먼저 실험을 다룰 것입니다.
일반 터미널에서 바로 할 수있는 흥미로운 일이 있습니다. 실행하면 다음 tty
과 같은 줄이 인쇄됩니다.
/dev/pts/2
터미널이 실행중인 TTY 장치입니다. 해당 터미널에 무언가를 쓸 수 있습니다.
$ echo Hello > /dev/pts/2
Hello
$
당신은 그것으로부터 읽을 수 있습니다 :
$ read X < /dev/pts/2
hello
$ echo $X
hello
$
( read X
sh는 “표준 입력에서 변수 X로 한 줄을 읽습니다”명령입니다. <는 / dev / pts / 2를 읽기 명령의 표준 입력으로 사용하는 것입니다. 첫 번째 “hello”는 입력했으며 두 번째는 인쇄되었습니다) .
다른 쉘을 열면 사용하여 말을 screen
하거나 xterm
당신이 실행 실행할 수 echo spooky > /dev/pts/2
텍스트가 원래 터미널에 나타나도록 그 껍질에, 다른 명령에 대해 동일합니다. 이 모든 것은 TTY인지 모른 채 파일을 여는 쉘입니다.
다음은 요청한 것을 수행하고 / dev / pts / 3에 단일 문자를 쓴 다음 단일 바이트를 다시 읽는 매우 간단한 C 프로그램입니다.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
char byte;
int fd = open("/dev/pts/3", O_RDWR);
write(fd, "X", 1);
ssize_t size = read(fd, &byte, 1);
printf("Read byte %c\n", byte);
return 0;
}
쉘 또는 터미널 에뮬레이터에 연결된 실제 TTY 장치에는 흥미로운 동작이 있지만 무언가를 가져와야합니다.
터미널에 액세스하려면 사용 권한이 있어야합니다. 이것들은 여러분이보고 ls -l
설정 하는 표준 파일 권한 입니다 chmod
. 파일을 열고 파일을 읽을 수있는 읽기 권한이 필요합니다. 터미널을 지원하는 TTY는 사용자가 소유하지만 다른 사용자의 TTY는 소유하지 않으며 구성에 따라 USB 장치의 TTY는 소유하거나 보유하지 않을 수 있습니다. 항상 같은 방식으로 권한을 변경할 수 있습니다.
작업 할 프로그램을 작성하는 한 많은 일을 할 필요는 없습니다. 예제에서 볼 필요 가없는 것은 다른 쪽 끝에서 데이터를 읽을 때마다 파일을 닫는 것입니다. TTY 파일은 파이프 라인처럼 작동하여 데이터를 양방향으로 밀어 넣습니다. 내가 TTY에 텍스트를 썼을 때, 그것은 즉시 나타 났고, 나중에 읽었을 때 이미 나를 기다리는 것은 없었습니다. 그건 하지 데이터가 디스크에 저장됩니다 일반 파일에 쓰기처럼 – 그것은 다른 측면에 즉시 전달, 또는 누군가가 표시 될 때까지 메모리에 저장됩니다.
선택 기능 을 사용하여 장치가 무언가를 말하기를 기다리는 동안 다른 일을 할 수 있지만 데이터가 올 때까지 기다릴 수 있으면 블로킹 읽기를 사용하여 OS가 수행하도록 할 수 있습니다 리프팅.
명심해야 할 것은 커널에 버퍼 크기가 제한 될 수 있다는 것입니다. 많은 데이터를 한 번에 쓰면 아무런 의미없이 블로킹이 발생할 수 있습니다. 이것이 문제가 될 가능성이 있으면와 함께 비 차단 IO를 사용하십시오 open("/dev/...", O_RDWR | O_NONBLOCK)
. 원칙은 어느 쪽이든 동일합니다.