ในฐานะของพฤศจิกายน 2014 , รุ่นล่าสุดของstartxwinการใช้งานxinitที่จะเริ่มต้น Cygwin / XWin.exeเซิร์ฟเวอร์เอ็กซ์ซึ่งเรียกว่าจริง กระบวนการดังกล่าวเป็นเช่นนี้:
- คุณโทรมา
startxwin
startxwinสร้าง.Xauthorityไฟล์ใหม่และหนึ่งไฟล์ที่เรียกว่า.serverauth.1234(โดยที่1234การเปลี่ยนแปลงแต่ละครั้งที่คุณเริ่ม X)
startxwin ตั้งค่าพารามิเตอร์ไคลเอ็นต์และเซิร์ฟเวอร์บางอย่าง
startxwinเรียกใช้xinitด้วยพารามิเตอร์ไคลเอนต์และเซิร์ฟเวอร์รวมถึงเชลล์สคริปต์เผื่อเลือกและการอ้างอิงไปยังไฟล์รับรองความถูกต้อง
xinit สตาร์ทเซิร์ฟเวอร์ X รันสคริปต์ rc บางตัว
xinitสตาร์ทไคลเอ็นต์ (โดยปกติxterm) หรือสคริปต์ rc ของไคลเอ็นต์ เราต้องการหลีกเลี่ยงสิ่งนี้
- เมื่อคุณปิดไคลเอนต์หรือสคริปต์ rc ไคลเอ็นต์เสร็จสิ้นให้
xinitปิดเซิร์ฟเวอร์ X หากเราหลีกเลี่ยงขั้นตอนที่ 6 เราก็ต้องหลีกเลี่ยงสิ่งนี้เช่นกัน
มันเป็นไปได้ที่จะเรียกใช้XWin.exeโดยตรงจากภายในเปลือกเข้าสู่ระบบทุบตีโดยไม่ต้องงานรอบที่startxwinและxinitดำเนินการ ข้อได้เปรียบหลักของสิ่งนี้คือมันทำงานเหมือนที่เราต้องการ: เซิร์ฟเวอร์ X เริ่มทำงานและยังคงทำงานอยู่ น่าเสียดายเนื่องจากไม่มี.Xauthorityไฟล์ที่ถูกส่งระหว่างการเริ่มต้นเซิร์ฟเวอร์ X ของคุณจะอนุญาตให้กระบวนการในท้องถิ่นใด ๆ เชื่อมต่อกับมันซึ่งไม่ปลอดภัย
โชคดีที่มันxinitทำสิ่งที่เราไม่ต้องการมากที่สุด มีแฮ็คด่วนที่ข้ามxinitแต่เก็บองค์ประกอบที่เหลือของstartxwinที่เกี่ยวข้องกับเซิร์ฟเวอร์เอง
TL; DR:ในstartxwinมีเส้นอยู่ด้านล่างที่อ่านไปนี้:
eval xinit \"$client\" $clientargs -- \"$server\" $display $serverargs
เปลี่ยนบรรทัดนั้นเป็น:
eval \"$server\" $display $serverargs
จากนี้ไปstartxwinสคริปต์จะเรียกโดยตรงมากกว่าการโทรXWin.exe xinitเห็นได้ชัดว่านี่จะปิดการใช้งานสคริปต์ลูกค้า rc แต่เราไม่ต้องการให้สคริปต์เหล่านั้นมาตั้งแต่แรก นอกจากนี้ยังหมายความว่า X จะยังคงทำงานต่อไปโดยไม่จำเป็นต้องมีกระบวนการไคลเอนต์เพื่อทำให้มันมีชีวิตอยู่ (เช่นป้องกันการxinitฆ่ามัน)
exec sleep infinityตามที่แสดงไว้ที่นี่: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit