tty * 장치를 읽고 쓰는 방법?


29

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

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


1
cat을 사용하여 읽고 에코하여 쓰십시오. "모든 것은 파일입니다":)
dchirikov

시리얼 콘솔을 열어 볼 수 있습니다. screen이 작업을 수행 할 수 있습니다miniterm
mikeserv

프로그래밍 방식으로 생각하고있었습니다. 이것이 사실이고 실제로 그렇게 쉽다면 (파일을 열고 읽는 것만으로) 무한 루프를 작성하여 파일을 지속적으로 열고, 읽고, 닫고, 이전 시간 이후 새로운 데이터가있을 때 업데이트 하시겠습니까? 'tty'장치가 프로그램에서 파일을 연 경우 파일에 쓰려고하면 어떻게됩니까?
sherrellbc

도움이 될 수 있습니다 : cmrr.umn.edu/~strupp/serial.html : open (), read (), write () 및 select (). 특별한 것은 없습니다.
dchirikov 2016 년

@sherrellbc-스크립트 screen및 / 또는 miniterm프로그래밍 방식으로 할 수 있습니다 .
mikeserv 2016 년

답변:


38

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). 원칙은 어느 쪽이든 동일합니다.


sudo echo Hello > /dev/tty4데스크탑 환경에있을 때 노력하고 있지만 bash: /dev/tty4: Permission deniedtty4에 로그인하지 않으면 나타납니다. 그러나 tty4에 로그인하면 모든 것이 잘 작동합니다. 그 이유는 무엇입니까?
Utku

@Utku, 그것은 가상 터미널로 인증 한 후에 제거되는 일종의 권한 문제입니다. 로그인 전후에 파일 권한을 확인하십시오.ls -l /dev/tty4
sherrellbc

1
> /dev/tty4부분 IST의하지 부 echo에 의해 시작된 구성 프로세스 sudo의 일부이지만 sudo현재 사용자에 의해 실행되는 프로세스 자체. 현재 사용자에 대한 파일 권한이 루트 대신 적용됩니다.
Robin479
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.