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)
กับ หลักการจะเหมือนกันทั้งสองวิธี