TTYs ऐसी फाइलें हैं जिनका उपयोग आप किसी अन्य की तरह कर सकते हैं। आप उन्हें अपनी भाषा के मानक फ़ाइल-खोलने वाले टूल से खोल सकते हैं और उनसे पढ़ सकते हैं या लिख सकते हैं। उनके पास कुछ विशेष व्यवहार हैं जो "साधारण" फाइलों के लिए अलग हैं, लेकिन मूल बातें समान हैं। मैं अंत में कुछ विशेष मामलों को कवर करूंगा, लेकिन पहले, एक प्रयोग।
एक दिलचस्प बात आप एक नियमित टर्मिनल से सीधे कर सकते हैं। भागो tty
और यह एक लाइन की तरह प्रिंट करेगा:
/dev/pts/2
टीटीवाई डिवाइस आपके टर्मिनल में चल रहा है। आप उस टर्मिनल पर कुछ लिख सकते हैं:
$ echo Hello > /dev/pts/2
Hello
$
तुम भी इसे से पढ़ सकते हैं:
$ read X < /dev/pts/2
hello
$ echo $X
hello
$
( read X
sh है "वेरिएबल एक्स में स्टैंडर्ड इनपुट से एक लाइन पढ़ें" कमांड; <का उपयोग / देव / pts / 2 को रीड कमांड के लिए स्टैंडर्ड इनपुट के रूप में करना है; पहला "हैलो" मैंने टाइप किया, और दूसरा प्रिंट आउट किया गया) ।
यदि आप एक और शेल खोलते हैं , तो उपयोग करके screen
या xterm
, कह सकते हैं कि आप चला सकते हैंecho spooky > /dev/pts/2
अपने मूल टर्मिनल पर पाठ को प्रकट करने के लिए उस शेल में , और अन्य कमांड के लिए भी। यह सब सिर्फ एक खोल है जो बिना किसी TTY को जाने बिना एक फ़ाइल खोल रहा है।
यहाँ एक बहुत ही सरल सी प्रोग्राम है जो आपके द्वारा पूछे गए कार्यों को करता है, और एकल चरित्र / 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
: आपको फ़ाइल खोलने और पढ़ने के लिए पढ़ने की अनुमति की आवश्यकता है, और उस पर लिखने की अनुमति लिखें। TTYs जो आपके टर्मिनल का स्वामित्व आपके पास होगा, लेकिन आपके कॉन्फ़िगरेशन के आधार पर किसी अन्य उपयोगकर्ता का TTY नहीं होगा, और USB डिवाइसों के लिए TTYs हो सकते हैं या नहीं भी हो सकते हैं। आप अनुमतियों को हमेशा की तरह बदल सकते हैं।
जहाँ तक इसके साथ काम करने का कार्यक्रम लिखने की बात है, तो आपको कुछ विशेष करने की आवश्यकता नहीं है। आप उदाहरण में देख सकते हैं कि एक चीज़ जो आपको करने की ज़रूरत नहीं है वह है कि हर बार अपने डेटा को दूसरे छोर से पढ़ने के लिए फ़ाइल को बंद करें: TTY फाइलें पाइपलाइन की तरह काम करती हैं, जैसे ही यह आता है दोनों दिशाओं में डेटा को धक्का देती है। जब मैंने TTY को पाठ लिखा, तो यह तुरंत दिखाई दिया, और जब मैंने इससे पढ़ा तो मेरे लिए पहले से ही कुछ भी इंतजार नहीं कर रहा था। आईटी इस एक नियमित फ़ाइल पर लिखने जैसा नहीं है जहां डेटा डिस्क पर सहेजा जाता है - यह तुरंत दूसरी तरफ से पारित हो जाता है, या किसी को पढ़ने तक मेमोरी में संग्रहीत होता है।
आप चयन का उपयोग करना चाह सकते हैं फ़ंक्शन ताकि आप डिवाइस को कुछ कहने के लिए प्रतीक्षा करते समय अन्य काम कर सकें, लेकिन अगर आप केवल डेटा के माध्यम से आने के लिए इंतजार कर रहे हैं, तो आप अवरुद्ध रीडिंग का उपयोग कर सकते हैं और ओएस को कर सकते हैं उठाने।
एक बात का ध्यान रखें कि कर्नेल में सीमित बफर आकार हो सकता है, और यदि आप एक साथ बहुत सारे डेटा लिखते हैं तो आप बिना मतलब के ब्लॉकिंग को समाप्त कर सकते हैं। तो संभावना है कि एक समस्या होने के लिए, का उपयोग गैर-अवरुद्ध आईओ के साथ open("/dev/...", O_RDWR | O_NONBLOCK)
। सिद्धांत भी उसी तरह होगा।