ตอนแรกฉันพยายามติดตามบางส่วนxterm
กลับไปที่xterm
pid ตามข้อมูลที่ฉันพบ/proc/locks
แต่มันหลวม ฉันหมายถึงมันใช้งานได้ฉันคิดว่า แต่มันเป็นเรื่องที่ดีที่สุดในด้านการเงิน - ฉันไม่เข้าใจข้อมูลทั้งหมดที่ไฟล์ให้และตรงกับสิ่งที่ดูเหมือนจะสอดคล้องระหว่างเนื้อหาและกระบวนการเทอร์มินัลที่รู้จักเท่านั้น
จากนั้นฉันก็ลองดูกระบวนการที่lsof/strace
ใช้งานอยู่write/talk
ระหว่าง ptys ผมไม่เคยใช้จริงโปรแกรมอย่างใดอย่างหนึ่งก่อน utmp
แต่พวกเขาดูเหมือนจะพึ่งพา หาก pty เป้าหมายของฉันไม่มีutmp
รายการไม่ว่าด้วยเหตุผลใดพวกเขาทั้งสองปฏิเสธที่จะยอมรับว่ามีอยู่จริง อาจมีวิธีแก้ไข แต่ฉันก็สับสนพอที่จะละทิ้งมัน
ฉันพยายามudevadm
ค้นพบบางอย่างกับโหนดอุปกรณ์หลักจำนวน 136 และ 128 ตัวตามที่โฆษณาpts
และptm
ตามลำดับ/proc/tty/drivers
แต่ฉันก็ยังขาดประสบการณ์ที่มีประโยชน์มากกับเครื่องมือนั้น อย่างไรก็ตามที่น่าสนใจฉันสังเกตเห็นว่า:min
ช่วงของอุปกรณ์ทั้งสองประเภทนั้นอยู่ในรายการที่น่าประหลาด0-1048575
ใจ
มันไม่ได้จนกว่าฉันจะกลับมายังเอกสารเคอร์เนลนี้ที่ฉันเริ่มคิดเกี่ยวกับปัญหาในแง่ของmount
แม้ว่า ฉันเคยอ่านมาหลายครั้งแล้ว แต่เมื่อทำการวิจัยต่อเนื่องในบรรทัดนั้นทำให้ฉันได้รับpatchset 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
อย่างที่คุณเห็นด้วยการทดสอบที่ชัดเจนเพียงเล็กน้อยกระบวนการเช่นนี้อาจทำให้การส่งออกกระบวนการหลักของ pty โดยพลการได้อย่างน่าเชื่อถือ เกี่ยวกับซ็อกเก็ตฉันค่อนข้างแน่ใจว่าจะสามารถเข้าถึงได้จากทิศทางนั้นและใช้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
มันพิมพ์$$
num \0
null null ไปที่แต่ละ pty และตรวจสอบกระบวนการ io ของกระบวนการหลักเทียบกับการตรวจสอบก่อนหน้า หากความแตกต่าง$$
นั้นจะเชื่อมโยง pid กับ pty นี้ส่วนใหญ่ทำงาน ฉันหมายถึงสำหรับฉันมันจะกลับมา:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
ซึ่งถูกต้อง แต่เห็นได้ชัดว่ามันมีชีวิตชีวาเล็กน้อย ฉันหมายถึงถ้าหนึ่งในคนอื่น ๆ กำลังอ่านข้อมูลจำนวนมากในเวลาที่มันอาจจะพลาด ฉันกำลังพยายามหาวิธีการเปลี่ยนstty
โหมดใน pty อื่นเพื่อส่งบิตหยุดก่อนหรือบางอย่างเช่นนั้นเพื่อให้ฉันสามารถแก้ไขได้
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
จะให้รายชื่อของ PID (/proc/PID
) เป็นเอาท์พุท