tty * 장치를 읽고 쓰는 방법? ttyUSB0에서를 /dev/. I가

USB를 통해 컴퓨터로 정보를 보내는 장치가 있습니다. 아치 리눅스라는 이름의 파일을 생성하여이 장치를 설정 ttyUSB0에서를 /dev/. I가 사용하고 GTKterm,이 입력 정보를 수신하고, 에뮬레이트 단자 창에 표시하도록.

내 질문은 GTKtermttyUSB0파일 을 어떻게 정확하게 읽고 쓸 수 있으며 비슷한 기능을 구현하는 방법을 어디서 배울 수 있습니까? 즉, 가장 기본적인 형태로,에 문자를 ttyUSB0쓰거나 반대로 바이트를 받아서 파일에 쓰려면 어떻게해야합니까?



답변

TTY는 다른 것과 마찬가지로 사용할 수있는 파일입니다. 해당 언어의 표준 파일 열기 도구를 사용하여 열어서 읽거나 쓸 수 있습니다. “일반적인”파일과 다른 특수한 동작이 있지만 기본 사항은 동일합니다. 마지막에는 몇 가지 특별한 경우를 다루지 만 먼저 실험을 다룰 것입니다.

일반 터미널에서 바로 할 수있는 흥미로운 일이 있습니다. 실행하면 다음 tty과 같은 줄이 인쇄됩니다.

/dev/pts/2

터미널이 실행중인 TTY 장치입니다. 해당 터미널에 무언가를 쓸 수 있습니다.

$ echo Hello > /dev/pts/2
Hello
$

당신은 그것으로부터 읽을 수 있습니다 :

$ read X < /dev/pts/2
hello
$ echo $X
hello
$

( read Xsh는 “표준 입력에서 변수 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). 원칙은 어느 쪽이든 동일합니다.