POSIX spec ป้องกันความเสี่ยงของการเดิมพันในส่วนที่เกี่ยวข้องกับเทอร์มินัลการควบคุมและกำหนด:
- เทอร์มินัลการควบคุม
- คำถามที่อาจหมายถึงไฟล์พิเศษหลายไฟล์ที่อ้างถึงเทอร์มินัลไม่ได้อยู่ใน POSIX.1 ชื่อพา ธ
/dev/tty
คือคำพ้องความหมายสำหรับเทอร์มินัลการควบคุมที่เกี่ยวข้องกับกระบวนการ
ที่อยู่ในรายการคำจำกัดความ - และนั่นคือทั้งหมดที่มี แต่ในGeneral Terminal Interfaceบางคนกล่าวว่า:
เทอร์มินัลอาจเป็นของกระบวนการในฐานะเทอร์มินัลการควบคุม แต่ละกระบวนการของเซสชันที่มีเทอร์มินัลการควบคุมมีเทอร์มินัลการควบคุมเดียวกัน เทอร์มินัลอาจเป็นเทอร์มินัลการควบคุมได้ไม่เกินหนึ่งเซสชัน เทอร์มินัลการควบคุมสำหรับเซสชันได้รับการจัดสรรโดยผู้นำเซสชันในลักษณะที่กำหนดไว้ในการนำไปปฏิบัติ หากผู้นำเซสชันไม่มีเทอร์มินัลการควบคุมและเปิดไฟล์อุปกรณ์เทอร์มินัลที่ไม่ได้เชื่อมโยงกับเซสชันโดยไม่ใช้ตัวเลือก O_NOCTTY (ดู open ()) จะมีการกำหนดการนำไปใช้งานไม่ว่าจะกลายเป็นเทอร์มินัล หัวหน้า.
เทอร์มินัลการควบคุมนั้นสืบทอดโดยกระบวนการลูกในระหว่างการเรียกใช้ฟังก์ชัน fork () กระบวนการเลิกใช้เทอร์มินัลการควบคุมเมื่อสร้างเซสชันใหม่ด้วยsetsid()
ฟังก์ชั่น; กระบวนการอื่นที่เหลืออยู่ในเซสชันเก่าที่มีเทอร์มินัลนี้เนื่องจากเทอร์มินัลการควบคุมของพวกเขายังคงมีอยู่ เมื่อปิดตัวอธิบายไฟล์สุดท้ายในระบบ (หรือไม่ว่าจะอยู่ในเซสชันปัจจุบัน) ที่เชื่อมโยงกับเทอร์มินัลการควบคุมจะไม่มีการระบุว่ากระบวนการทั้งหมดที่มีเทอร์มินัลนั้นเป็นเทอร์มินัลการควบคุม ไม่ว่าผู้นำเซสชันจะสามารถเรียกคืนเทอร์มินัลการควบคุมได้อีกหรือไม่หลังจากที่เทอร์มินัลการควบคุมถูกปล่อยออกมาในรูปแบบนี้จะไม่มีการระบุ กระบวนการไม่ยกเลิกการควบคุมเทอร์มินัลเพียงแค่ปิดไฟล์ descriptors ทั้งหมดที่เชื่อมโยงกับเทอร์มินัลการควบคุมหากกระบวนการอื่นยังคงเปิดอยู่
มีหลายสิ่งที่เหลือไม่ระบุ - และโดยสุจริตฉันคิดว่ามันสมเหตุสมผล แม้ว่าเทอร์มินัลจะเป็นส่วนต่อประสานผู้ใช้ที่สำคัญ แต่ยังมีสิ่งอื่น ๆ อีกมากมายในบางกรณีเช่นฮาร์ดแวร์จริงหรือแม้กระทั่งเครื่องพิมพ์ชนิดหนึ่ง แต่ในหลาย ๆ กรณีมันแทบไม่มีอะไรเลย - xterm
ซึ่งเป็นเพียงอีมูเลเตอร์ . เป็นการยากที่จะระบุเฉพาะเจาะจง - และฉันไม่คิดว่ามันจะเป็นประโยชน์กับ Unix มากนักเนื่องจากเทอร์มินัลทำมากกว่า Unix
อย่างไรก็ตาม POSIX ก็ยังค่อนข้างแน่นอนว่าps
ควรทำอย่างไรในกรณีที่ ctty เกี่ยวข้อง
มี-a
สวิตช์:
- เขียนข้อมูลสำหรับกระบวนการทั้งหมดที่เกี่ยวข้องกับเทอร์มินัล การใช้งานอาจละเว้นผู้นำเซสชันจากรายการนี้
ยิ่งใหญ่ ผู้นำเซสชันอาจถูกละเว้น นั่นไม่เป็นประโยชน์มาก
และ-t
:
- เขียนข้อมูลสำหรับกระบวนการที่เกี่ยวข้องกับเทอร์มินัลที่กำหนดในคำศัพท์ แอปพลิเคชันจะต้องทำให้แน่ใจว่า termlist เป็นอาร์กิวเมนต์เดี่ยวในรูปแบบของรายการ
<blank>
หรือคั่นด้วยเครื่องหมายจุลภาค ตัวระบุเทอร์มินัลจะได้รับในรูปแบบที่กำหนดการนำไปปฏิบัติ
... ซึ่งเป็นอีกสิ่งที่ทำให้ผิดหวัง แต่มันจะพูดเกี่ยวกับระบบ XSI ต่อไปนี้:
- ในระบบ XSI สอดคล้องพวกเขาจะได้รับในหนึ่งในสองรูปแบบ: ชื่อไฟล์ของอุปกรณ์ (ตัวอย่างเช่น
tty04
) หรือหากอุปกรณ์ของชื่อไฟล์ที่เริ่มต้นด้วยtty
เพียงแค่ระบุต่อไปนี้ตัวอักษรtty
(ตัวอย่าง04
)
มันดีกว่านิดหน่อย แต่ไม่ใช่เส้นทาง นอกจากนี้ในระบบ XSI ยังมี-d
สวิตช์อีกด้วย:
- เขียนข้อมูลสำหรับกระบวนการทั้งหมดยกเว้นผู้นำเซสชัน
... ซึ่งอย่างน้อยก็ชัดเจน คุณสามารถระบุ-o
สวิตช์ utput ได้เช่นกันกับ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
สิ่งที่เป็นเพียงเพื่อแสดงให้เห็นว่ามันจะทำงานเมื่อไม่มี subshells ค้นหามีใด ๆ ของ 0,1,2 เชื่อมต่อกับ ctty อย่างไรก็ตามที่พิมพ์:
/dev/pts/3: mikeserv 3342 F.... (mikeserv)zsh
ตอนนี้ได้รับเส้นทางเต็มบนเครื่องของฉันและฉันคิดว่ามันจะสำหรับคนส่วนใหญ่ในกรณีส่วนใหญ่ ฉันสามารถจินตนาการได้ว่ามันอาจล้มเหลว มันเป็นแค่ฮิวริสติกหยาบ
สิ่งนี้อาจล้มเหลวด้วยเหตุผลอื่น ๆ อีกมากมาย แต่ถ้าคุณอยู่ในระบบที่อนุญาตให้ผู้นำเซสชันเลิกใช้ descriptor ทั้งหมดไปที่ ctty และยังคง sid อยู่ตามที่ spec อนุญาตดังนั้นนี่จะไม่ช่วยได้แน่นอน ที่กล่าวว่าฉันคิดว่านี่อาจได้รับการประเมินที่ดีในกรณีส่วนใหญ่
ของหลักสูตรที่ง่ายที่สุดในสิ่งที่จะทำอย่างไรถ้าคุณมีใดอธิบายเชื่อมต่อกับ ctty ของคุณเป็นเพียง ...
tty <&2
... หรือคล้ายกัน
ps
โซลูชันนี้ครอบคลุมระบบส่วนใหญ่ (และwho
ไม่ได้ช่วยอะไรมากไปกว่านั้นps
) อาจมีโค้ดเพิ่มอีกนิดเพื่อจัดการตัวระบุเพียงอย่างเดียว (เช่น "04") ฉันสงสัยว่ามีวิธีแก้ปัญหาแบบพกพามากขึ้นหรือไม่