สิ่งสำคัญคือต้องเข้าใจว่าทุกกระบวนการมีชุดตัวแปรสภาพแวดล้อมของตัวเอง
เมื่อกระบวนการเรียกการเรียกของfork()
ระบบกระบวนการที่สอง ( ลูก ) เหมือนกันเป็นครั้งแรก ( แม่ ) ถูกสร้างขึ้น ( สำเนานี้รวมถึงสภาพแวดล้อมซึ่งอยู่เหนือกอง (หรือด้านล่างขึ้นอยู่กับวิธีที่คุณคิดว่าสแต็ค:-)
-) แต่ใน Unix / Linux สแต็คที่เติบโตลดลงจากที่อยู่สูง)
โดยปกติแล้วกระบวนการลูกจะเรียกการเรียกของexecve()
ระบบซึ่งจะทิ้งทุกอย่างในหน่วยความจำ (เสมือน) และสร้างใหม่จากรหัสและส่วนข้อมูลในไฟล์ไบนารีที่ระบุ
แต่เมื่อมันreconstructsกองสำเนาสภาพแวดล้อมและการโต้แย้งสตริงส่งผ่านไปexecve()
บนสแต็คเป็นครั้งแรก (ตามลำดับ) ก่อนการเรียกmain()
ฟังก์ชั่น (จำนวนมากของการทำงานจะทำในcrt0
รหัสบูตหลังจากที่execve()
ผลตอบแทน (ไปยังรายการ จุดที่ระบุไว้ในไบนารี))
มีห่อสำหรับที่มีexecve()
การเรียกระบบในห้องสมุด C ที่จะผ่านสภาพแวดล้อมในปัจจุบัน (เช่นคัดลอกของสภาพแวดล้อมของผู้ปกครอง) แทนของผู้โทรให้มัน (เพื่อให้มีผลบังคับใช้เด็กจะได้รับมรดกของสภาพแวดล้อมของผู้ปกครอง) - environ(7)
ดู
ลองใช้คำสั่ง (เป็น root) ps axeww | less
... ซึ่งจะแสดงสภาพแวดล้อมสำหรับกระบวนการทั้งหมด ! สิ่งที่น่าสนใจคือ id ของกระบวนการ 1 (เช่นinit
กระบวนการ - กระบวนการแรกที่สร้างโดยเคอร์เนลในเวลาบูต)
หากคุณต้องการดูสภาพแวดล้อมของกระบวนการเฉพาะ (และคุณรู้ว่าเป็นรหัสกระบวนการ) ให้ลองเรียกใช้คำสั่งcat /proc/<PID>/environ
(แทนที่<PID>
ด้วยรหัสกระบวนการ)
โปรดทราบว่าหากโปรเซสมีสิทธิ์เพียงพอก็สามารถเขียนสแต็คของตัวเองใหม่ซึ่งทำให้ยากที่จะรู้ว่าสภาพแวดล้อมคืออะไร - คุณจะเห็นกระบวนการ daemon บางอย่างเช่นนี้ในเอาต์พุต ps
แต่ในท้ายที่สุดวาฟเฟิลทั้งหมดจะเดือดร้อนถึงสิ่งที่ @chaos กล่าวไว้ข้างต้นหากคุณต้องการดูค่าปัจจุบันของตัวแปรสภาพแวดล้อมที่เฉพาะเจาะจงในกระบวนการเชลล์ของคุณเพียงใช้คำสั่งecho "$<NAME>"
( builtin) (แทนที่<NAME>
ด้วยชื่อของ ตัวแปรสภาพแวดล้อมที่คุณสนใจ) ... โปรดทราบว่าตัวแปรเดียวกันอาจมีค่าแตกต่างกันหรือไม่มีเลยในกระบวนการอื่น
echo
เป็นตัวเลือกที่ไม่ดีของคำสั่งเนื่องจากสามารถแปลงเนื้อหาของตัวแปรได้ มันจะส่งออกเนื้อหาของพารามิเตอร์เปลือกด้วยชื่อเดียวกัน นั่นคือไม่จำเป็นต้องเหมือนกันถ้าใช้บอร์นเปลือกหรือ env vars เช่น1
,*
ตัวอย่างเช่น และคุณไม่สามารถใช้วิธีการนั้นสำหรับ env vars ที่ชื่อไม่ถูกต้องเป็นชื่อตัวแปรเชลล์