सबसे पहले मैंने जानकारी के आधार पर पिड पर कुछ xtermएस वापस ट्रेस करने की कोशिश की जो xtermमुझे मिली, /proc/locksलेकिन यह ढीली थी। मेरा मतलब है, यह काम किया है, मुझे लगता है, लेकिन यह सबसे अच्छी स्थिति में था - मैं पूरी तरह से उस जानकारी को पूरी तरह से नहीं समझता हूं जो फ़ाइल प्रदान करती है और केवल वही मिलान कर रही थी जो इसकी सामग्री और ज्ञात टर्मिनल प्रक्रियाओं के बीच मेल खाती थी।
फिर मैंने पेंटी के बीच lsof/straceएक सक्रिय write/talkप्रक्रिया को देखने की कोशिश की । मैंने पहले कभी भी या तो कार्यक्रम का उपयोग नहीं किया था, लेकिन वे भरोसा करते हैं utmp। अगर मेरी लक्षित पीटी में utmpउन दोनों कारणों के लिए कोई प्रविष्टि नहीं थी , जो दोनों ने स्वीकार किया था कि यह अस्तित्व में है। हो सकता है कि इसके आसपास एक रास्ता हो, लेकिन मैं इसे छोड़ने के लिए काफी उलझन में था।
मैंने udevadm136 और 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
यह प्रत्येक pty के लिए $$num \0null बाइट को प्रिंट करता है और प्रत्येक मास्टर प्रक्रिया के पिछले चेक के विरुद्ध io की जाँच करता है। यदि अंतर है $$तो यह पीट को पीटीआई के साथ जोड़ता है। यह ज्यादातर काम करता है। मेरा मतलब है, मेरे लिए, यह रिटर्न:
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आउटपुट के रूप में पीआईडी ( ) की सूची प्रदान करेगा ।