প্রথমে আমি xterm
যে xterm
তথ্য পেয়েছি তার ভিত্তিতে পিডের দিকে কয়েক সেকেন্ড পিছনে ট্রেস করার চেষ্টা করেছি /proc/locks
তবে এটি আলগা ছিল। আমার অর্থ, এটি কাজ করেছিল, আমি মনে করি, তবে এটি সর্বোত্তম পরিস্থিতিতে ছিল - ফাইলটি যে সমস্ত তথ্য সরবরাহ করে এবং এটি কেবল তার সামগ্রীতে এবং টার্মিনাল প্রক্রিয়াগুলির মধ্যে মিল বলে মনে হয় তার সাথে মিলে যায় এমন সমস্ত তথ্য আমি পুরোপুরি বুঝতে পারি না।
তারপরে আমি ptys এর মধ্যে lsof/strace
একটি সক্রিয় write/talk
প্রক্রিয়া দেখার চেষ্টা করেছি। আমি বাস্তবে এর আগে কোনও প্রোগ্রামই আগে কখনও ব্যবহার করি নি, তবে তারা নির্ভর করে বলে মনে হচ্ছে utmp
। যদি আমার টার্গেট পাইটির utmp
কোনও কারণেই যদি কোনও প্রবেশপথ না থাকে তবে তারা উভয়ই এটি বিদ্যমান বলে স্বীকার করতে অস্বীকার করেছিল। এর আশেপাশে কোনও উপায় থাকতে পারে তবে আমি এটিকে পরিত্যাগ করার জন্য যথেষ্ট বিভ্রান্ত ছিলাম।
আমি udevadm
136 এবং 128 মেজর নাম্বার ডিভাইস নোডগুলির সাথে pts
এবং ptm
যথাক্রমে বিজ্ঞাপনিত হিসাবে কিছু আবিষ্কারের চেষ্টা করেছি /proc/tty/drivers
, তবে আমারও সেই সরঞ্জামটির সাথে খুব কার্যকর অভিজ্ঞতা নেই এবং আবারও যথেষ্ট কিছুই প্রমাণিত হয়নি। আকর্ষণীয়ভাবে, যদিও, আমি লক্ষ্য করেছি যে :min
উভয় ডিভাইসের ধরণের পরিসীমাটি স্তম্ভিত করে তালিকাভুক্ত করা হয়েছিল 0-1048575
।
যদিও আমি এই কার্নেল ডকটি পুনর্বিবেচনা না করেছিলাম যা আমি এর ক্ষেত্রে সমস্যাটি নিয়ে ভাবতে শুরু করি mount
। আমি এর আগে বেশ কয়েকবার পড়েছি কিন্তু যখন সেই লাইনে অবিরত গবেষণা আমাকে এই 2012 /dev/pts
প্যাচসেটের দিকে নিয়েছিল আমার ধারণা ছিল:
sudo fuser -v /dev/ptmx
আমি ভাবলাম আমি সাধারণত একটি এর সাথে প্রক্রিয়াগুলি সংযুক্ত করতে কী ব্যবহার করব mount
? এবং যথেষ্ট নিশ্চিত:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
সুতরাং সেই তথ্য দিয়ে আমি করতে পারি, উদাহরণস্বরূপ terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
আপনি দেখতে পাচ্ছেন, সামান্য সুস্পষ্ট পরীক্ষার মাধ্যমে এই জাতীয় প্রক্রিয়াটি বেশ নির্ভরযোগ্যভাবে একটি স্বেচ্ছাসেবীর প্রতিফলনের মাস্টার প্রক্রিয়াটিকে আউটপুট করা যায়। সকেটগুলির বিষয়ে, আমি মোটামুটি নির্দিষ্টভাবে একজন socat
ডিবাগারের বিপরীতে ব্যবহার করে সেদিকেই যেতে পারি, তবে কীভাবে তা আমি সোজা করতে পারি না। তবুও, আমার সন্দেহ হয় ss
আপনি যদি আমার চেয়ে বেশি পরিচিত হন তবে এটি সহায়তা করতে পারে:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
সুতরাং আমি এটি আরও কিছুটা স্পষ্ট পরীক্ষার সাথে সেট আপ করেছি, আসলে:
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
এটি প্রতিটি পিটিআইয়ের কাছে নাল $$
নাইট \0
বাইটগুলি প্রিন্ট করে এবং প্রতিটি মাস্টার প্রক্রিয়াটির আইওটিকে আগের চেকের বিপরীতে পরীক্ষা করে। পার্থক্য যদি হয় $$
তবে এটি পিটিটি pty এর সাথে যুক্ত করে। এটি বেশিরভাগ ক্ষেত্রেই কাজ করে। আমার অর্থ, এটি আমার কাছে ফিরে আসে:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
কোনটি সঠিক, তবে স্পষ্টতই, এটি সামান্য সাম্প্রদায়িকতা। আমি বলতে চাইছি, সেই সময়ে যদি অন্য একজনের মধ্যে একগুচ্ছ ডেটা পড়ছিল তবে সম্ভবত এটি মিস হবে। আমি stty
প্রথমে স্টপ বিট বা এরকম কিছু পাঠানোর জন্য কীভাবে অন্য একটি পিটিআইয়ের মোডগুলি পরিবর্তন করতে হবে তা বোঝার চেষ্টা করছি যাতে আমি এটি ঠিক করতে পারি।
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
,/proc/PID
আউটপুট হিসাবে পিআইডি ( ) এর তালিকা সরবরাহ করবে ।