ट्टी * डिवाइस को कैसे पढ़ें / लिखें?


29

मेरे पास एक उपकरण है जो USB की जानकारी मेरे कंप्यूटर पर भेजता है। आर्क लिनक्स नाम की एक फ़ाइल बनाने के द्वारा इस उपकरण सेट ttyUSB0में /dev/। मैं GTKtermइस आने वाली जानकारी को प्राप्त करने और इसे एक उत्सर्जित टर्मिनल विंडो में प्रदर्शित करने के लिए उपयोग कर रहा हूं ।

मेरा प्रश्न यह है कि GTKtermइस ttyUSB0फ़ाइल को वास्तव में कैसे पढ़ा / लिखा जाता है , और मैं कहाँ से सीखना शुरू कर सकता हूँ कि कैसे समान कार्यक्षमता को लागू किया जाए? यही है, सबसे बुनियादी रूप में, मैं एक चरित्र को कैसे लिख सकता हूं ttyUSB0, या इसके विपरीत, एक बाइट प्राप्त कर सकता हूं और इसे एक फाइल पर लिख सकता हूं ?


1
पढ़ने के लिए और लिखने के लिए प्रतिध्वनि करने के लिए बिल्ली का उपयोग करने का प्रयास करें। यूनिक्स में "सब कुछ एक फाइल है" :)
dchirikov

आप इस पर एक सीरियल कंसोल खोलने की कोशिश कर सकते हैं। screenयह कर सकते हैं, औरminiterm
चाटुकार

मैं एक प्रोग्रामेटिक एप्रोच के संदर्भ में सोच रहा था। यदि यह सच है और यह वास्तव में इतना आसान है (केवल फ़ाइल को खोलना और पढ़ना है), तो क्या आप केवल एक अनंत लूप को लगातार खोलने, पढ़ने, फ़ाइल को बंद करने और अद्यतन करने के लिए लिखेंगे जब नया डेटा पिछले समय से मौजूद है? यदि आपके प्रोग्राम में 'tty' डिवाइस फाइल में लिखने का प्रयास करता है तो क्या होगा?
sherrellbc

हो सकता है कि यह मदद करता है: cmrr.umn.edu/~strupp/serial.html : open (), read (), write () और सेलेक्ट ()। कुछ खास नहीं, ऐसा लगता है।
dchirikov

@ sherrellbc - आप स्क्रिप्ट screenऔर / या minitermप्रोग्राम कर सकते हैं ।
माइकस

जवाबों:


38

TTYs ऐसी फाइलें हैं जिनका उपयोग आप किसी अन्य की तरह कर सकते हैं। आप उन्हें अपनी भाषा के मानक फ़ाइल-खोलने वाले टूल से खोल सकते हैं और उनसे पढ़ सकते हैं या लिख ​​सकते हैं। उनके पास कुछ विशेष व्यवहार हैं जो "साधारण" फाइलों के लिए अलग हैं, लेकिन मूल बातें समान हैं। मैं अंत में कुछ विशेष मामलों को कवर करूंगा, लेकिन पहले, एक प्रयोग।

एक दिलचस्प बात आप एक नियमित टर्मिनल से सीधे कर सकते हैं। भागो ttyऔर यह एक लाइन की तरह प्रिंट करेगा:

/dev/pts/2

टीटीवाई डिवाइस आपके टर्मिनल में चल रहा है। आप उस टर्मिनल पर कुछ लिख सकते हैं:

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

तुम भी इसे से पढ़ सकते हैं:

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

( read Xsh है "वेरिएबल एक्स में स्टैंडर्ड इनपुट से एक लाइन पढ़ें" कमांड; <का उपयोग / देव / 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)। सिद्धांत भी उसी तरह होगा।


मैं कोशिश कर sudo echo Hello > /dev/tty4रहा हूं कि जब मैं डेस्कटॉप वातावरण में हूं, लेकिन bash: /dev/tty4: Permission deniedअगर मुझे tty4 में लॉग इन नहीं किया गया है तो मुझे मिल जाएगा। हालाँकि अगर मुझे tty4 में लॉग इन किया जाता है, तो सब कुछ ठीक रहता है। इसका क्या कारण है?
Utku

@Utku, यह निश्चित रूप से कुछ प्रकार की अनुमतियों की समस्या है जो वर्चुअल टर्मिनल के साथ प्रमाणीकरण के बाद हटा दी जाती है। लॉग इन करने से पहले और बाद में फ़ाइल अनुमतियों की जाँच करें।ls -l /dev/tty4
sherrellbc

1
यह > /dev/tty4हिस्सा उपप्रकार का हिस्सा नहीं echoहै, sudoबल्कि sudoप्रक्रिया का हिस्सा है, जिसे वर्तमान उपयोगकर्ता द्वारा निष्पादित किया जाता है। रूट के बजाय वर्तमान उपयोगकर्ता के लिए फ़ाइल अनुमतियाँ लागू होती हैं।
रॉबिन ४।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.