টিটিটি * ডিভাইসে কীভাবে পড়তে / লিখতে হয়?


29

আমার একটি ডিভাইস রয়েছে যা আমার কম্পিউটারে ইউএসবি মাধ্যমে তথ্য প্রেরণ করে। আর্চ লিনাক্স নামের একটি ফাইল তৈরি করে এই ডিভাইসটি সেট আপ ttyUSB0মধ্যে /dev/। আমি GTKtermএই ইনকামিং তথ্যটি গ্রহণ করতে এবং এটি একটি অনুকরণীয় টার্মিনাল উইন্ডোতে প্রদর্শন করতে ব্যবহার করছি।

আমার প্রশ্ন হ'ল GTKtermএই ttyUSB0ফাইলটিতে ঠিক কীভাবে পড়তে / লিখতে হয় এবং অনুরূপ কার্যকারিতাটি কীভাবে প্রয়োগ করা যায় আমি কোথায় শিখতে শুরু করব? এটি, সবচেয়ে বেসিক আকারে, আমি কীভাবে একটি অক্ষর লিখতে পারি ttyUSB0, বা বিপরীতে, একটি বাইট পেতে এবং এটি একটি ফাইলে লিখতে পারি?


1
পড়তে বিড়াল ব্যবহার করার চেষ্টা করুন এবং লিখতে ইকো করুন। ইউনিক্সে "সবকিছুই একটি ফাইল" :)
চিরিকভ

আপনি এটিতে একটি সিরিয়াল কনসোল খোলার চেষ্টা করতে পারেন। screenএটি করতে পারেন, এবংminiterm
মাইকসার্ভ

আমি একটি প্রোগ্রামেটিক পদ্ধতির শর্তে ভাবছিলাম। যদি এটি সত্য হয় এবং এটি সত্যই সহজ (কেবলমাত্র ফাইলটি খোলার এবং পড়ার কারণে), আপনি কি পূর্ববর্তী সময় থেকে নতুন তথ্য উপস্থিত থাকার সময় অবিচ্ছিন্নভাবে খুলতে, পড়তে, ফাইলটি বন্ধ করতে এবং আপডেট করার জন্য একটি অসীম লুপ লিখবেন? 'টিটিটি' ডিভাইসটি যদি আপনার প্রোগ্রামটিতে খোলা থাকে তবে ফাইলটিতে লেখার চেষ্টা করলে কী হবে?
sherrellbc

এটি সহায়ক হতে পারে: সেমিআর.আম.আডু / ~সরেপ / সিরিয়াল.ইচটিএমএল : খুলুন (), পড়ুন (), লিখুন () এবং নির্বাচন করুন ()। বিশেষ কিছু না, মনে হচ্ছে।
dchirikov

@ শেরেললবিসি - আপনি স্ক্রিপ্ট করতে পারেন screenএবং / অথবা minitermপ্রোগ্রামক্রমে।
মাইকজার্ভ

উত্তর:


38

টিটিওয়াই হ'ল এমন ফাইল যা আপনি অন্যগুলির মতো ব্যবহার করতে পারেন। আপনি এগুলিকে আপনার ভাষার স্ট্যান্ডার্ড ফাইল খোলার সরঞ্জামগুলি দিয়ে খুলতে পারেন এবং সেগুলি থেকে পড়তে বা লিখতে পারেন। তাদের কিছু বিশেষ আচরণ রয়েছে যা "সাধারণ" ফাইলগুলির চেয়ে আলাদা তবে মূল বিষয়গুলি একই the আমি শেষে কিছু বিশেষ কেস কভার করব, তবে প্রথমে, একটি পরীক্ষা।

একটি নিয়মিত টার্মিনাল থেকে সরাসরি করা যায় এমন একটি আকর্ষণীয় কাজ। চালান ttyএবং এটি একটি লাইন প্রিন্ট করবে:

/dev/pts/2

আপনার টার্মিনালটি সেই টিটিওয়াই ডিভাইসটিতে চলছে That's আপনি সেই টার্মিনালটিতে কিছু লিখতে পারেন:

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

আপনি এটি থেকে পড়তে পারেন:

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

( read Xsh এর "স্ট্যান্ডার্ড ইনপুট থেকে ভেরিয়েবল এক্স-তে একটি লাইন পড়ুন"; <টি হ'ল রিড কমান্ডের জন্য স্ট্যান্ডার্ড ইনপুট হিসাবে / dev / pts / 2 ব্যবহার করা; প্রথম "হ্যালো" আমি টাইপ করেছি এবং দ্বিতীয়টি মুদ্রিত হয়েছিল) ।

আপনি যদি অন্য শেলটি খোলেন, ব্যবহার করে বলুন screenবা xterm, echo spooky > /dev/pts/2আপনার মূল টার্মিনালে টেক্সটটি প্রদর্শিত হওয়ার জন্য আপনি সেই শেলটি চালিয়ে চালাতে পারেন এবং অন্যান্য কমান্ডের ক্ষেত্রেও এটি একই। এই সমস্ত কিছুই কেবল আপনার শেল এটি কোনও টিটিওয়াই না জেনে কোনও ফাইল খোলার।


এখানে একটি খুব সাধারণ সি প্রোগ্রাম রয়েছে যা আপনি যা চেয়েছিলেন ঠিক তেমন করে এবং / 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;
}

একটি শেল বা টার্মিনাল এমুলেটরের সাথে সংযুক্ত একটি আসল টিটিওয়াই ডিভাইসের সেখানে আকর্ষণীয় আচরণ হবে তবে আপনাকে কিছুটা ফিরে পাওয়া উচিত।


একটি টার্মিনাল অ্যাক্সেস করতে আপনার এটি ব্যবহারের অনুমতি থাকতে হবে। এগুলি হ'ল যে স্ট্যান্ডার্ড ফাইল অনুমতিগুলি আপনি দেখেন ls -lএবং সেটির সাথে সেট করেন chmod: ফাইলটি খোলার জন্য এবং এটি পড়ার জন্য আপনার পড়ার অনুমতি প্রয়োজন এবং এতে লেখার অনুমতি লিখতে হবে। আপনার টার্মিনালটি টিটিওয়াইগুলি আপনার নিজের মালিকানাধীন হবে তবে অন্য কোনও ব্যবহারকারীর টিটিওয়াই করবে না এবং ইউএসবি ডিভাইসের জন্য টিটিওয়াই আপনার কনফিগারেশনের উপর নির্ভর করে হতে পারে বা নাও পারে or আপনি অনুমতিগুলি বরাবরের মতো একইভাবে পরিবর্তন করতে পারেন।

এটির সাথে কাজ করার জন্য কোনও প্রোগ্রাম লেখার ক্ষেত্রে আপনার খুব বেশি বিশেষ করার দরকার নেই। আপনি উদাহরণটিতে দেখতে পাচ্ছেন যে আপনার প্রয়োজন নেই এমন একটি জিনিস প্রতিবার আপনার ফাইলটি অন্য প্রান্তে পড়ার জন্য ফাইলটি বন্ধ করা হয়: টিটিওয়াই ফাইলগুলি পাইপলাইনের মতো কাজ করে, কেবলমাত্র উভয় দিকের তথ্য প্রবেশ করেই। আমি যখন টিটিওয়াইয়ের কাছে পাঠ্যটি লিখেছিলাম তা অবিলম্বে উপস্থিত হয়েছিল এবং আমি যখন এটি থেকে পড়েছি তখনই আমার জন্য অপেক্ষা করার কিছু ছিল না। এটি কোনও নিয়মিত ফাইলটিতে লেখার মতো নয় যেখানে ডেটা ডিস্কে সংরক্ষণ করা হয় - এটি অবিলম্বে অন্যদিকে চলে যায়, বা কেউ এটি না পড়ে মেমোরিতে সঞ্চয় করে।

আপনি নির্বাচিত ফাংশনটি ব্যবহার করতে চাইতে পারেন যাতে আপনি ডিভাইসটির কিছু বলার অপেক্ষা রাখার সময় আপনি অন্যান্য জিনিসগুলি করতে পারেন, তবে আপনি যদি কেবল ডেটা আসার জন্য অপেক্ষা করতে খুশি হন তবে আপনি কেবল ব্লকিং রিড ব্যবহার করতে পারেন এবং ওএসকে করতে দিন উত্তোলন

একটি বিষয় মনে রাখবেন যে কার্নেলের মধ্যে সীমিত বাফার আকার থাকতে পারে এবং আপনি যদি একবারে প্রচুর ডেটা লিখেন তবে আপনি কোনও অর্থ ছাড়াই অবরুদ্ধ হতে পারেন। যদি তাই সম্ভবত একটি সমস্যা হতে, ব্যবহার অ ব্লক আই সঙ্গে open("/dev/...", O_RDWR | O_NONBLOCK)। নীতিটি উভয় উপায়ে একই হবে।


আমি sudo echo Hello > /dev/tty4যখন ডেস্কটপ এনভায়রনমেন্টে থাকি তখন চেষ্টা করি তবে আমি bash: /dev/tty4: Permission deniedটিটি 4 তে লগ ইন না করে থাকলে পাই। তবে আমি tty4 এ লগ ইন থাকলে, সবকিছু ঠিকঠাক কাজ করে। এটার কারণ কি?
উত্কু

@ উটকু, এটি অবশ্যই এক ধরণের অনুমতি সমস্যা যা ভার্চুয়াল টার্মিনালের সাথে প্রমাণীকরণের পরে অপসারণ করা হয়। ফাইল অনুমতি পরীক্ষা করুন আগে ও পরে আপনি লগ ইন করেছি।ls -l /dev/tty4
sherrellbc

1
> /dev/tty4অংশ IST অংশ নয় echosubprocess শুরু sudoকিন্তু অংশ sudoনিজেই প্রক্রিয়া, যা বর্তমান ব্যবহারকারীর দ্বারা সঞ্চালিত হয়। বর্তমান ব্যবহারকারীর জন্য ফাইলের অনুমতিগুলি রুটের পরিবর্তে প্রয়োগ হয়।
রবিন 479
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.