কীভাবে নিয়ন্ত্রণকারী টার্মিনালের আসল নাম পাবেন?


13

কীভাবে নিয়ন্ত্রণের টার্মিনালের আসল নামটি (যদি একটি থাকে, অন্যথায় ত্রুটি থাকে) একটি পথের নাম হিসাবে কীভাবে পেতে পারেন?

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

নোট করুন যে স্ট্যান্ডার্ড ইনপুট পুনঃনির্দেশিত করা সত্ত্বেও এটি অবশ্যই কাজ করবে, যাতে ttyইউটিলিটিটি ব্যবহার করা যায় না: স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত টার্মিনালের ফাইলের নামটি প্রিন্ট করা not a ttyথেকে এই জাতীয় ক্ষেত্রে একটি ত্রুটি পেতে ttyপারে।

লিনাক্সের অধীনে, কেউ এটি ব্যবহার করতে পারেন:

echo "/dev/`ps -p $$ -o tty | tail -n 1`"

তবে এটি পোর্টেবল নয়, পসআইএক্স অনুসারে, টার্মিনালের নামের ফর্ম্যাটটি অনির্দিষ্ট

সি ফাংশন, ctermid (NULL)রিটার্ন সম্পর্কিত /dev/tty, যা এখানে অকেজো।

দ্রষ্টব্য:zsh ডকুমেন্টেশন অনুসারে , একজনের পক্ষে সক্ষম হওয়া উচিত

zsh -c 'echo $TTY'

তবে বর্তমানে এটি (সংস্করণ 5.0.7) ব্যর্থ হয় যখন স্ট্যান্ডার্ড ইনপুট এবং স্ট্যান্ডার্ড আউটপুট উভয়ই পুনঃনির্দেশিত হয়:

$ zsh -c 'echo $TTY > /dev/tty' < /dev/null
/dev/pts/9
$ zsh -c 'echo $TTY > /dev/tty' < /dev/null > /dev/null
/dev/tty

@ মিকসার্ভ আমি মনে করি যে psসমাধানটি বেশিরভাগ সিস্টেমে (এবং এর whoচেয়ে বেশি সাহায্য করে না ps) কভার করে , সম্ভবত সনাক্তকারীকে একা সামলানোর জন্য কিছুটা আরও কোড সহ ("04" এর মতো)। আমি ভাবছিলাম যে এর থেকেও বেশি বহনযোগ্য সমাধান আছে কিনা।
ভিঙ্ক 17

এটি প্রি-পেয়ারড সেটগুলি সহ করতে পারে - পুরাতন বিএসডি- স্টাইল পিটিআই জোড়গুলিও, সম্ভবত। সমস্ত ptys UNIX 98 প্রকারের নয়। যাইহোক, এর থেকে man xterm: -Sccn এই বিকল্পটি xtermএকটি বিদ্যমান প্রোগ্রামের জন্য i / o চ্যানেল হিসাবে ব্যবহার করার অনুমতি দেয় ... বিকল্প মানটি গোলাম মোডে ব্যবহার করার জন্য একটি পাইটির নামের কয়েকটি অক্ষর, এবং উত্তরাধিকার সূত্রে প্রাপ্ত fd সংখ্যা। অপশনটিতে যদি একটি "/" অক্ষর থাকে তবে এটি পিডিটির নামটি এফডি থেকে সীমাবদ্ধ করে।
মাইকজার্ভ

@mikeserv উল্লেখ্য, সমাধান সঙ্গে কাজ করে না psথেকে , busybox (যা অ্যান্ড্রয়েড BTW, দ্বারা ব্যবহৃত হয়), এমনকি জিএনইউ / লিনাক্স অধীনে। " xtermএটি পরিচালনা করতে পারে " বলতে কী বোঝ 04?
ভিঙ্ক 17

busyboxপসিক্স-কনফর্মেন্ট নয়। toyboxতবে, খুব ভাল করে।
মাইকজার্ভ

উত্তর:


8

"কন্ট্রোলিং টার্মিনাল" ওরফে। ctty মধ্য থেকে "distincted হয় টার্মিনাল একটি প্রক্রিয়া সাথে আলাপচারিতার হয়"।

সিটিটির পথ পাওয়ার স্ট্যান্ডার্ড উপায় হ'ল সিটারমিড (3)। এটির কথা বলার পরে, মুক্তির জন্য 10 মুক্তির পরে, একটি প্রকৃত পথ সন্ধান করা হবে [1], যখন পুরানো ফ্রিবিএসডি এবং গ্লিবিসি বাস্তবায়ন [2] নিঃশর্ত "" / দেব / টিটি "] ফিরিয়ে দেয়।

লিনাক্স থেকে PS (1) 3.2.8 প্যাকেজ, procps জন্য / proc / * / পরিসংখ্যান সাংখ্যিক এন্ট্রি পড়তে [3], এবং তারপর পথনাম কেটে মনন দ্বারা আংশিকভাবে [4, 5] এ কারণে সিস্টেমের সহায়তার অভাব [6] ।

তবে যদি আমরা সিটিটির প্রতি কঠোরভাবে আগ্রহী না হই তবে স্টডিওর সাথে সম্পর্কিত কোনও টার্মিনাল, টিটিআই (1) স্টিডিনের সাথে সংযুক্ত টার্মিনাল পাথটি মুদ্রণ করে, যা ttyname(fileno(stdin))সি এর সাথে অভিন্ন , এবং একটি বিকল্প readlink /proc/self/fd/0


শর্তহীন "/ dev / tty" আচরণ সম্পর্কিত কম গুরুত্বপূর্ণ ধারণা: স্পেসগুলি কেবল বলে দেয় যে স্ট্রিমটি সিটারমিড দ্বারা "যখন পথের নাম হিসাবে ব্যবহৃত হয়, বর্তমান কন্ট্রোলিং টার্মিনাল" দেখুন, কিছু সরল "পরিবর্তে" বর্তমানের পথের নাম কন্ট্রোলিং টার্মিনাল "। এটি ব্যাখ্যা করা যেতে পারে যে "/ dev / tty" নিয়ন্ত্রণকারী টার্মিনাল নয়, তবে একই প্রক্রিয়াটি খোলা থাকলে কেবল নিয়ন্ত্রণকারী টার্মিনালটি পড়ুন (3)। সুতরাং "একটি টার্মিনাল সর্বাধিক এক অধিবেশনের জন্য সিটিপি হতে পারে" বিধি লঙ্ঘন না []]।

আরেকটি পরিণতি হ'ল আমি যখন কোনও নিয়ন্ত্রণকারী টার্মিনাল ছাড়াই থাকি, তখন সিটারমিড ব্যর্থ হয় না - এ জাতীয় ব্যর্থতা চশমা দ্বারা অনুমোদিত হয় [8] - সুতরাং কেবলমাত্র পরবর্তী সিলেক্ট (3) ব্যর্থ না হওয়া পর্যন্ত আমি আমার চেতনাবোধ সম্পর্কে সচেতন হতে পারি, যা ঠিক আছে যেহেতু চশমা এটিতেও (3) ওপেন কল করা সফল হওয়ার গ্যারান্টিযুক্ত নয়।


psআমার প্রশ্নের যে সমাধানটি আমি দিয়েছিলাম তার চেয়ে এটি বহনযোগ্য নয় , যেহেতু সমস্ত ওএসের একটি /procফাইল সিস্টেম নেই। মনে রাখবেন যে psনিজেই একটি রিডলিঙ্ক ব্যবহার করে /proc/self/fd/2(এটি এমনকি কার্যকর ত্রুটিটি পুনঃনির্দেশিত করা হয়)।
ভিঙ্ক 17

1
সম্পাদনা করা হয়েছে। এবং পিটি রিডলিংক / প্রোক / * / এফডি / 2 তে সিটিটি খুঁজে না পেয়ে সংখ্যার টার্মিনালটিকে পাথের মানচিত্রের জন্য পরিপূরক তথ্য সন্ধান করতে লিংকটি দেখুন [৪] [৫]।
友情 留 在 无

1
দুর্দান্ত সম্পাদনা। সিটিটি সম্পর্কে; আমি ভিন 17 এর জন্য কথা বলতে পারি না, তবে আপনি সম্ভবত সর্বদা কোথাও লিখতে পারবেন, কেবলমাত্র একটি ফাইল আছে যা আপনার প্রক্রিয়া গ্রুপকে বাঁচিয়ে রাখতে অবশ্যই খোলা থাকতে হবে।
মাইকসার্ভ

1
@ ভিনক 17 - আপনার সিটিটিতে যদি কোনও ফাইল বর্ণনাকারী খোলা থাকে তবে আপনি সেগুলি সেগুলি দিয়ে পড়তে পারেন ttystderrএটি সম্ভবত সবচেয়ে ভাল কারণ এটি স্পষ্টতই r / w হবে। তাই tty <&2
মাইকজার্ভ

1
যে কোনও প্রদত্ত টার্মিনাল সর্বাধিক এক সেশনের জন্য সিটি হতে পারে এটি ctermid()সর্বদা ফিরে আসার জন্য গ্লিবসি-কে মেনে চলবে না "/dev/tty"। এই নামটি সর্বদা এটি অ্যাক্সেস করার প্রক্রিয়াটির নিয়ন্ত্রণকারী টার্মিনালকে বোঝায় , যা অধিবেশন অনুসারে পরিবর্তিত হয়। টার্মিনালটি সেশন নির্দিষ্ট, তবে এটির দ্বারা নামটি ব্যবহারের প্রয়োজন নেই।
পেলমেল

5

পসিক্স স্পেক যেখানে সত্যিকারের কন্ট্রোলিং টার্মিনাল সম্পর্কিত তার বেটগুলি হেজ করে এবং যা এটি এভাবে সংজ্ঞায়িত করে:

  • কন্ট্রোলিং টার্মিনাল
    • টার্মিনালটি উল্লেখ করে বেশ কয়েকটি বিশেষ ফাইলগুলির মধ্যে কোনটি বোঝানো হয়েছে তার প্রশ্নটি POSIX.1 এ সমাধান করা হয়নি। পথের নামটি /dev/ttyএকটি প্রক্রিয়া সম্পর্কিত কন্ট্রোলিং টার্মিনালের প্রতিশব্দ।

এটি সংজ্ঞা তালিকার মধ্যে রয়েছে - এবং এটি সেখানে রয়েছে। তবে জেনারেল টার্মিনাল ইন্টারফেসে আরও কিছু বলা হয়:

  • একটি টার্মিনাল এটির নিয়ন্ত্রণকারী টার্মিনাল হিসাবে কোনও প্রক্রিয়ার সাথে সম্পর্কিত হতে পারে। একটি নিয়ন্ত্রণকারী টার্মিনাল থাকা একটি সেশনের প্রতিটি প্রক্রিয়াতে একই নিয়ন্ত্রণকারী টার্মিনাল থাকে। একটি টার্মিনাল সর্বাধিক এক সেশনের জন্য নিয়ন্ত্রণকারী টার্মিনাল হতে পারে। একটি অধিবেশন জন্য নিয়ামক টার্মিনাল একটি বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে অধিবেশন নেতা দ্বারা বরাদ্দ করা হয়। যদি সেশন নেতার কোনও নিয়ন্ত্রণকারী টার্মিনাল না থাকে এবং O_NOCTTY বিকল্পটি ব্যবহার না করে সেশনের সাথে ইতিমধ্যে জড়িত না এমন একটি টার্মিনাল ডিভাইস ফাইল খোলে (খোলা (দেখুন)), এটি টার্মিনালটি সেশনের নিয়ন্ত্রণকারী টার্মিনাল হয়ে যায় কিনা তা প্রয়োগ-সংজ্ঞায়িত করা হয় নেতা।

  • কন্ট্রোলিং টার্মিনালটি কাঁটাচামচ () ফাংশন কলের সময় একটি শিশু প্রক্রিয়া দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হয়। যখন এটির সাথে একটি নতুন অধিবেশন তৈরি হয় তখন একটি প্রক্রিয়া তার নিয়ন্ত্রণকারী টার্মিনালটিকে ত্যাগ করেsetsid()ফাংশন; পুরানো সেশনে থাকা অন্যান্য প্রক্রিয়াগুলিতে এই টার্মিনালটি ছিল যেমন তাদের নিয়ন্ত্রণকারী টার্মিনালটি এটি চালিয়ে যেতে থাকে। নিয়ন্ত্রণকারী টার্মিনালের সাথে যুক্ত সিস্টেমের সর্বশেষ ফাইল বর্ণনাকারী (বর্তমান সেশনে থাকুক বা না থাকুক) সমাপ্ত হওয়ার পরে, এটি নিয়ন্ত্রণহীন টার্মিনাল হিসাবে যে টার্মিনালটির যে সমস্ত প্রক্রিয়া ছিল তার কোনও নিয়ন্ত্রণকারী টার্মিনাল বন্ধ ছিল কিনা তা অনির্ধারিত। এই ফ্যাশনে নিয়ন্ত্রণকারী টার্মিনালটি ত্যাগ করার পরে কোনও সেশন নেতা কোনও নিয়ন্ত্রণকারী টার্মিনালটির পুনঃনির্ধারণ করতে পারে কিনা তা অনির্দিষ্ট। কোনও প্রক্রিয়া নিয়ন্ত্রণকারী টার্মিনালের সাথে যুক্ত সমস্ত ফাইল বিবরণকারীকে বন্ধ করে কেবল তার নিয়ন্ত্রণকারী টার্মিনালটিকে ছেড়ে দেয় না, যদি অন্যান্য প্রক্রিয়াগুলি এটি চালিয়ে যেতে থাকে।

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

যাইহোক, psসিটিটি যেখানে উদ্বিগ্ন সেখানে কীভাবে আচরণ করা উচিত সে সম্পর্কে পসিক্সও বেশ সুন্দর ।

আছে -aসুইচ:

  • টার্মিনালের সাথে সম্পর্কিত সমস্ত প্রক্রিয়াগুলির জন্য তথ্য লিখুন। বাস্তবায়নগুলি এই তালিকা থেকে অধিবেশন নেতাদের বাদ দিতে পারে।

গ্রেট। সেশন নেতাদের বাদ দেওয়া যেতে পারে। এটি খুব সহায়ক নয়।

এবং -t:

  • টার্মলিস্টে প্রদত্ত টার্মিনালের সাথে সম্পর্কিত প্রক্রিয়াগুলির জন্য তথ্য লিখুন। অ্যাপ্লিকেশনটি নিশ্চিত করবে যে টার্মলিস্টটি একটি <blank>কমা বা বিচ্ছিন্ন তালিকার আকারে একক যুক্তি । টার্মিনাল শনাক্তকারীগণ একটি বাস্তবায়ন সংজ্ঞায়িত ফর্ম্যাটে দেওয়া হবে।

... যা অন্য এক ডাউন। তবে এটি এক্সএসআই সিস্টেমগুলি সম্পর্কে এটি বলার অপেক্ষা রাখে না:

  • এক্সএসআই-কনফর্মেন্ট সিস্টেমে এগুলিকে দুটি ফর্মের একটিতে দেওয়া হবে: ডিভাইসের ফাইলের নাম (উদাহরণস্বরূপ, tty04) বা, যদি ডিভাইসের ফাইল নামটি শুরু হয় tty, কেবল অক্ষরগুলি অনুসরণকারী সনাক্তকারী tty (উদাহরণস্বরূপ, 04)

এটি কিছুটা ভাল তবে এটি কোনও পথ নয়। এক্সএসআই সিস্টেমেও -dস্যুইচ রয়েছে:

  • সেশন লিডার বাদে সমস্ত প্রক্রিয়া সম্পর্কিত তথ্য লিখুন।

... যা অন্তত পরিষ্কার। আপনি ফর্ম্যাট স্ট্রিংয়ের -oপাশাপাশি উতপুট সুইচটিও নির্দিষ্ট করতে পারেন ttyতবে আপনি যেমন উল্লেখ করেছেন যে এর আউটপুট ফর্ম্যাটটি বাস্তবায়ন-সংজ্ঞায়িত। তবুও, আমি মনে করি এটি যতটা পায় তত ভাল। আমি মনে করি যে - অনেক কাজ করে - উপরের কিছুগুলি অন্যান্য ইউটিলিটির সাথে স্যুইচগুলি আপনাকে একটি ভাল ভাল বলপার্ক পেতে পারে। যদিও বেশ সত্যই বলতে চাই, কখনই বা আপনার জন্য এটি কীভাবে ভাঙবে তা আমি জানি না - এবং আমি এমন পরিস্থিতিটি কল্পনা করতে সক্ষম হইনি যে এটির ক্ষেত্রে। তবে, আমি মনে করি সম্ভবত আমরা যুক্ত করি fuserএবং findআমরা পথটি যাচাই করতে পারি।

exec 2<>/dev/null
ctty=$(sh -c 'ps -p "$$" -o tty=' <&2)
sid=$(sh -c 'ps -Ao pid= -o tty=|
      grep '"$ctty$"' | 
      grep -Fv "$(ps -do pid=)"'  <&2)
find / -type c -name "*${ctty##*/}*" \
       -exec fuser -uv {} \; 2>&1  |
grep ".*$ctty.*${sid%%"$ctty"*}"

/dev/nullস্টাফটি কেবল এটি দেখানোর জন্য ছিল যে অনুসন্ধানকারী সাবহেলগুলির কোনওরও সিটিটির সাথে 0,1,2 এর কোনও সংযুক্ত না থাকলে এটি কাজ করতে পারে। যাইহোক, যে মুদ্রণ:

/dev/pts/3:          mikeserv   3342 F.... (mikeserv)zsh

এখন উপরেরটিগুলি আমার মেশিনে পুরো পথটি পেয়েছে এবং আমি ধারণা করি এটি বেশিরভাগ ক্ষেত্রেই এটি বেশিরভাগ মানুষের জন্য। আমি এটি ব্যর্থ হতে পারে কল্পনা করতে পারেন। এটি কেবল মোটামুটি হুরিস্টিকস।

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

অবশ্যই সবচেয়ে সহজ পদ্ধিতি হল জিনিস যদি আপনি করতে কোনো আপনার ctty সংযুক্ত বর্ণনাকারী ঠিক ...

tty <&2

...অথবা অনুরুপ.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.