USB를 통해 내 컴퓨터로 정보를 보내는 장치가 있습니다. Arch Linux는 이러한 수신 메시지를 수신하고 이를 시뮬레이션된 터미널 창에 표시하는 데 사용했던 ttyUSB0
이라는 명령을 생성하여 이를 수행합니다./dev/
GTKterm
내 질문은 GTKterm
이 ttyUSB0
파일을 정확히 어떻게 읽고 쓸 수 있는지, 그리고 이와 같은 것을 구현하는 방법을 어디서 배울 수 있는지입니다. 즉, 가장 기본적인 형태로 어떻게 문자를 쓰거나 ttyUSB0
반대로 바이트를 받아 파일에 쓰나요?
답변1
TTY는 다른 파일처럼 사용할 수 있는 파일입니다. 해당 언어의 표준 파일 열기 도구를 사용하여 파일을 열고 읽거나 쓸 수 있습니다. "일반" 파일과 다른 몇 가지 특별한 동작이 있지만 기본 원칙은 동일합니다. 마지막에 몇 가지 특별한 경우를 다루겠지만 먼저 실험을 해보겠습니다.
일반 터미널에서 직접 할 수 있는 흥미로운 일이 있습니다. 실행하면 tty
다음 줄이 인쇄됩니다.
/dev/pts/2
이는 터미널이 실행 중인 TTY 장치입니다. 이 터미널에 뭔가를 쓸 수 있습니다:
$ echo Hello > /dev/pts/2
Hello
$
다음에서 읽을 수도 있습니다.
$ read X < /dev/pts/2
hello
$ echo $X
hello
$
( read X
sh의 "표준 입력에서 변수로 한 줄을 읽습니다).
screen
예를 들어 또는 를 사용하여 다른 셸을 열면 xterm
해당 셸에서 run 을 실행하여 원래 터미널에 텍스트가 표시되도록 할 수 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에 텍스트를 쓰면 바로 나타나고, 나중에 읽어보면 기다리는 것이 아무것도 없습니다. 그것은아니요일반 파일에 쓰는 것과 마찬가지로 데이터는 디스크에 저장됩니다. 즉시 다른 쪽 끝으로 전송되거나 누군가 읽을 때까지 메모리에 저장됩니다.
당신은 사용하고 싶을 수도 있습니다선택하다기능을 사용하면 장치가 통신할 때까지 기다리는 동안 다른 작업을 할 수 있지만 데이터가 전달될 때까지 기다릴 의향이 있는 경우 차단 읽기를 사용하고 운영 체제에서 리프팅 작업을 수행하도록 할 수 있습니다.
한 가지 명심해야 할 점은 커널의 버퍼 크기가 제한될 수 있으며 한 번에 많은 양의 데이터를 쓰면 의도치 않게 차단될 수 있다는 것입니다. 이것이 문제가 될 수 있다면 다음을 사용하십시오.비차단 IO그리고 open("/dev/...", O_RDWR | O_NONBLOCK)
. 어느 쪽이든 원칙은 동일합니다.