วิธีการอ่าน / เขียนไปยังอุปกรณ์ tty *


29

ฉันมีอุปกรณ์ที่ส่งข้อมูลผ่าน USB ไปยังคอมพิวเตอร์ของฉัน Arch Linux ตั้งค่าอุปกรณ์นี้โดยการสร้างไฟล์ชื่อในttyUSB0 /dev/ฉันใช้GTKtermเพื่อรับข้อมูลขาเข้านี้และแสดงในหน้าต่างเทอร์มินัลที่จำลอง

คำถามของฉันคือจะGTKtermอ่าน / เขียนttyUSB0ไฟล์นี้ได้อย่างไรและฉันจะเริ่มเรียนรู้วิธีการใช้ฟังก์ชันการทำงานที่คล้ายกันได้อย่างไร นั่นคือในรูปแบบพื้นฐานที่สุดฉันจะเขียนอักขระttyUSB0อย่างไรหรือในทางตรงกันข้ามจะได้รับไบต์และเขียนลงในไฟล์ได้อย่างไร


1
ลองใช้ cat เพื่ออ่านและ echo เพื่อเขียน "ทุกอย่างเป็นไฟล์" ในยูนิกซ์ :)
dchirikov

คุณสามารถลองเปิดคอนโซลอนุกรมได้ screenสามารถทำเช่นนี้และminiterm
mikeserv

ฉันคิดในแง่ของวิธีการเขียนโปรแกรม ถ้านี่เป็นเรื่องจริงและมันง่ายมาก (แค่เปิดและอ่านไฟล์) คุณจะเขียนวงวนไม่สิ้นสุดเพื่อเปิดอ่านต่อเนื่องปิดไฟล์และอัปเดตเมื่อมีข้อมูลใหม่ตั้งแต่ครั้งก่อนหรือไม่? จะเกิดอะไรขึ้นถ้าอุปกรณ์ 'tty' พยายามเขียนลงไฟล์ถ้าคุณเปิดมันในโปรแกรมของคุณ?
sherrellbc

อาจช่วยได้: cmrr.umn.edu/~strupp/serial.html : open (), read (), write () และ select () ดูเหมือนไม่มีอะไรพิเศษ
dchirikov

@sherrellbc - คุณสามารถเขียนสคริปต์screenและ / หรือเขียนminitermโปรแกรมได้
mikeserv

คำตอบ:


38

TTYs เป็นไฟล์ที่คุณสามารถใช้ได้เหมือนกัน คุณสามารถเปิดได้ด้วยเครื่องมือเปิดไฟล์มาตรฐานของภาษาของคุณและอ่านหรือเขียนจากพวกเขา พวกเขามีพฤติกรรมพิเศษที่แตกต่างจากไฟล์ "ธรรมดา" แต่พื้นฐานก็เหมือนกัน ฉันจะครอบคลุมบางกรณีพิเศษในตอนท้าย แต่ก่อนอื่นการทดสอบ

สิ่งหนึ่งที่น่าสนใจที่คุณสามารถทำได้โดยตรงจากสถานีปกติ เรียกใช้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 เป็นอินพุตมาตรฐานสำหรับคำสั่ง read; "Hello" ตัวแรกที่ฉันพิมพ์และที่สองถูกพิมพ์ออกมา) .

หากคุณเปิดเชลล์อื่นให้พูดโดยใช้screenหรือxtermคุณสามารถเรียกใช้echo spooky > /dev/pts/2ในเชลล์นั้นเพื่อทำให้ข้อความปรากฏบนเทอร์มินัลดั้งเดิมของคุณและเหมือนกันสำหรับคำสั่งอื่น ทั้งหมดนี้เป็นเพียงเปลือกของคุณเปิดไฟล์โดยไม่ทราบว่าเป็น TTY


นี่คือโปรแกรม C ที่ง่ายมากที่ทำในสิ่งที่คุณถามและเขียนอักขระเดียวไปยัง / dev / pts / 3 จากนั้นอ่านไบต์เดียวกลับมาจากมัน:

#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 ของผู้ใช้รายอื่นจะไม่และ TTY สำหรับอุปกรณ์ USB อาจหรือไม่นั้นขึ้นอยู่กับการกำหนดค่าของคุณ คุณสามารถเปลี่ยนการอนุญาตในแบบเดียวกับที่เคยเป็น

เท่าที่เขียนโปรแกรมเพื่อทำงานกับมันไปคุณไม่จำเป็นต้องทำพิเศษมาก คุณสามารถเห็นได้ในตัวอย่างที่สิ่งหนึ่งที่คุณไม่จำเป็นต้องทำคือปิดไฟล์ทุกครั้งเพื่อให้ข้อมูลของคุณอ่านได้ที่ปลายอีกด้านหนึ่ง: ไฟล์ TTY ทำหน้าที่เหมือนท่อส่งข้อมูลเพียงกดทั้งสองทิศทางเมื่อมันเข้ามา เมื่อฉันเขียนข้อความถึง TTY มันจะปรากฏขึ้นทันทีและเมื่อฉันอ่านมันหลังจากนั้นไม่มีอะไรรอฉันอยู่แล้ว มันไม่เหมือนกับการเขียนไปยังไฟล์ปกติที่ข้อมูลถูกบันทึกไว้ในดิสก์ - มันจะถูกส่งต่อไปยังอีกด้านทันทีหรือเก็บไว้ในหน่วยความจำจนกว่าจะมีคนอ่าน

คุณอาจต้องการใช้ฟังก์ชั่นเลือกเพื่อให้คุณสามารถทำสิ่งอื่น ๆ ในขณะที่รอให้อุปกรณ์พูดบางอย่าง แต่ถ้าคุณยินดีที่จะรอให้ข้อมูลผ่านเข้ามาคุณสามารถใช้การบล็อกการอ่านและให้ระบบปฏิบัติการทำ การยก

สิ่งหนึ่งที่ต้องจำไว้ก็คืออาจมีขนาดบัฟเฟอร์ที่ จำกัด ในเคอร์เนลและหากคุณเขียนข้อมูลจำนวนมากในครั้งเดียวคุณอาจสิ้นสุดการบล็อกโดยไม่มีความหมาย ถ้าที่มีแนวโน้มที่จะมีปัญหาใช้ไม่ปิดกั้น IOopen("/dev/...", O_RDWR | O_NONBLOCK)กับ หลักการจะเหมือนกันทั้งสองวิธี


ฉันพยายามsudo echo Hello > /dev/tty4เมื่อฉันอยู่ในสภาพแวดล้อมเดสก์ทอป แต่ฉันได้รับbash: /dev/tty4: Permission deniedถ้าฉันไม่ได้เข้าสู่ระบบเพื่อ tty4 อย่างไรก็ตามถ้าฉันลงชื่อเข้าใช้ 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.