สัญลักษณ์ @ แสดงถึงอะไรในจุดเริ่มต้นของเส้นทางซ็อกเก็ตโดเมน unix ใน Linux


17

เมื่อฉันเรียกnetstat --protocol unixหรือlsof -Uผมเห็นว่าบางเส้นทางซ็อกเก็ตยูนิกซ์จะใช้ได้กับสัญลักษณ์ @ ตัวอย่างเช่น@ / tmp / dbus-qj8V39Yrpa จากนั้นเมื่อฉันเรียกใช้ls -l /tmpฉันไม่เห็นไฟล์ชื่อdbus-qj8V39Yrpa ที่นั่น

คำถามคือสิ่งที่สัญลักษณ์ @ ที่เติมไว้แสดงว่าอะไร และคำถามที่เกี่ยวข้องที่สองคือ - ฉันจะหาไฟล์ซ็อกเก็ต unix ได้ที่ไหน ( @ / tmp / dbus-qj8V39Yrpa ) บนระบบไฟล์


1
สำหรับสิ่งที่คุ้มค่าssโปรแกรมที่ทันสมัยยิ่งขึ้นยังแสดงจุดสิ้นสุดของซ็อกเก็ตเช่น "@ / tmp / .X11-unix / X0"
Bruce Ediger

คำตอบ:


33

@อาจบ่งชี้ซ็อกเก็ตจัดขึ้นในabstract namespaceซึ่งไม่ได้อยู่ในแฟ้มในระบบแฟ้มที่

การอ้างอิงจากThe Linux Programming InterfaceโดยMichael Kerrisk :

57.6 Namespace ของซ็อกเก็ตบทคัดย่อของ Linux

abstract namespace ที่เรียกว่าเป็นคุณสมบัติเฉพาะของ Linux ที่ช่วยให้เราสามารถผูกซ็อกเก็ตโดเมน UNIX กับชื่อที่ไม่มีชื่อนั้นถูกสร้างขึ้นในระบบไฟล์ นี่เป็นข้อได้เปรียบที่อาจเกิดขึ้น:

  • เราไม่ต้องกังวลเกี่ยวกับการชนกันของชื่อที่มีอยู่ในระบบไฟล์
  • ไม่จำเป็นต้องยกเลิกการเชื่อมโยงชื่อพา ธ ซ็อกเก็ตเมื่อเราใช้ซ็อกเก็ตเสร็จแล้ว ชื่อนามธรรมจะถูกลบโดยอัตโนมัติเมื่อปิดซ็อกเก็ต
  • เราไม่จำเป็นต้องสร้างชื่อพา ธ ระบบไฟล์สำหรับซ็อกเก็ต สิ่งนี้อาจมีประโยชน์ในสภาพแวดล้อม chroot หรือถ้าเราไม่มีสิทธิ์การเขียนในระบบไฟล์

ในการสร้างการโยงแบบนามธรรมเราระบุไบต์แรกของ ฟิลด์sun_pathเป็นไบต์ว่าง (\ 0) [ ... ]

การแสดงการนำหน้าnull byteเพื่อแสดงถึงซ็อกเก็ตประเภทนี้อาจเป็นเรื่องยากดังนั้นอาจเป็นสาเหตุของ@สัญญาณนำหน้า


2
เป็นที่น่าสังเกตว่ามีการป้อนอักขระ ASCII NUL ในเทอร์มินัลจำนวนมากเป็น ^ @ ([Ctrl] + [@]) และสามารถแสดงเป็น ^ @ เมื่อแสดงโดยคำสั่ง Unix ต่างๆ (เช่น GNU cat -a)
จิมเดนนิส

7

ตาม man 7 unix

  • นามธรรม: ที่อยู่ซ็อกเก็ตนามธรรมมีความแตกต่างจากข้อเท็จจริงที่ว่า sun_path [0] เป็นไบต์ว่าง ( \0) ไบต์ที่เหลือทั้งหมดใน sun_path กำหนด "ชื่อ" ของซ็อกเก็ต (ไบต์ Null ในชื่อไม่มีความสำคัญเป็นพิเศษ) ชื่อไม่มีการเชื่อมต่อกับชื่อพา ธ ของระบบไฟล์ ที่อยู่ซ็อกเก็ตใน namespace นี้จะได้รับจากส่วนที่เหลือของไบต์ใน sun_path เมื่อที่อยู่ของซ็อกเก็ตนามธรรมถูกส่งคืนโดย getsockname (2), getpeername (2) และยอมรับ (2) ความยาวของมันคือขนาดของ sizeof (struct sockaddr_un) และ sun_path มีชื่อนามธรรม บทคัดย่อซ็อกเก็ตเนมสเปซคือส่วนขยาย Linux ที่ไม่สามารถพกพาได้

ดูเหมือนว่าสิ่งเหล่านี้เป็น 'นามธรรม' - ดังนั้นจึงไม่มีเส้นทางจริงปรากฏบนระบบไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.