เวิร์กสเตชันออนไลน์ของ OnWorks Linux และ Windows

โลโก้

ฟรีโฮสติ้งออนไลน์สำหรับเวิร์กสเตชัน

<ก่อนหน้านี้ | Contents | ถัดไป>

การขอ -u และ -a ตัวเลือกให้ข้อมูลเพิ่มเติม สำหรับตัวเลือกเพิ่มเติมและสิ่งที่พวกเขาทำ โปรดดูที่หน้าข้อมูล


ในส่วนถัดไป เราจะมาดูกันว่ากระบวนการหนึ่งสามารถสร้างกระบวนการอื่นได้อย่างไร


ภาพ

4.1.5. ชีวิตและความตายของกระบวนการ


4.1.5.1. การสร้างกระบวนการ


กระบวนการใหม่ถูกสร้างขึ้นเนื่องจากกระบวนการที่มีอยู่สร้างสำเนาของตัวเองอย่างถูกต้อง โปรเซสลูกนี้มีสภาพแวดล้อมเดียวกันกับพาเรนต์ เฉพาะหมายเลข ID โปรเซสเท่านั้นที่แตกต่างกัน ขั้นตอนนี้เรียกว่า ส้อม.


หลังจากกระบวนการ forking พื้นที่ที่อยู่ของกระบวนการลูกจะถูกเขียนทับด้วยข้อมูลกระบวนการใหม่ สิ่งนี้ทำผ่าน an exec โทรเข้าระบบ.


การขอ ทางแยกและดำเนินการ กลไกจึงเปลี่ยนคำสั่งเก่าด้วยคำสั่งใหม่ ในขณะที่สภาพแวดล้อมที่รันโปรแกรมใหม่ยังคงเหมือนเดิม ซึ่งรวมถึงการกำหนดค่าของอุปกรณ์อินพุตและเอาต์พุต ตัวแปรสภาพแวดล้อม และลำดับความสำคัญ กลไกนี้ใช้เพื่อสร้างกระบวนการ UNIX ทั้งหมด ดังนั้นจึงใช้กับระบบปฏิบัติการ Linux ด้วย แม้แต่ขั้นตอนแรก initด้วย ID กระบวนการ 1 จะถูกแยกระหว่างขั้นตอนการบู๊ตใน

ที่เรียกว่า ความร่วมมือ ขั้นตอน


โครงร่างนี้แสดงให้เห็นถึงกลไกการ fork-and-exec ID กระบวนการเปลี่ยนหลังจากขั้นตอนส้อม:


รูปที่ 4-1 กลไก Fork-and-exec


ภาพ


มีบางกรณีที่ init กลายเป็นพาเรนต์ของกระบวนการ ในขณะที่กระบวนการไม่ได้เริ่มโดย initอย่างที่เราเห็นใน พีทรี ตัวอย่าง. หลายโปรแกรม เช่น ปีศาจ กระบวนการลูกของพวกเขา เพื่อให้สามารถทำงานต่อไปได้เมื่อพาเรนต์หยุดหรือถูกหยุด ตัวจัดการหน้าต่างเป็นตัวอย่างทั่วไป มันเริ่มและ xterm กระบวนการที่สร้างเชลล์ที่ยอมรับคำสั่ง ตัวจัดการหน้าต่างจะปฏิเสธความรับผิดชอบเพิ่มเติมและส่งต่อกระบวนการลูกไปที่ init. การใช้กลไกนี้ทำให้สามารถเปลี่ยนตัวจัดการหน้าต่างได้โดยไม่ขัดจังหวะแอปพลิเคชันที่ทำงานอยู่


สิ่งต่างๆ เกิดขึ้นเป็นครั้งคราว แม้กระทั่งในครอบครัวที่ดี ในกรณีพิเศษ กระบวนการอาจเสร็จสิ้นในขณะที่พาเรนต์ไม่รอให้กระบวนการนี้เสร็จสิ้น กระบวนการที่ไม่ถูกฝังดังกล่าวเรียกว่า ซอมบี้ กระบวนการ


ภาพ

4.1.5.2. สิ้นสุดกระบวนการ


เมื่อกระบวนการสิ้นสุดลงตามปกติ (ไม่ได้ถูกฆ่าหรือถูกขัดจังหวะโดยไม่คาดคิด) โปรแกรมจะส่งคืน สถานะทางออก ให้กับผู้ปกครอง สถานะการออกนี้เป็นตัวเลขที่ส่งคืนโดยโปรแกรมซึ่งแสดงผลลัพธ์ของการดำเนินการของโปรแกรม ระบบการส่งคืนข้อมูลเมื่อดำเนินงานมีต้นกำเนิดในภาษาการเขียนโปรแกรม C ที่ UNIX ถูกเขียนขึ้น


รหัสส่งคืนสามารถตีความโดยผู้ปกครองหรือในสคริปต์ ค่าของรหัสส่งคืนเป็นค่าเฉพาะของโปรแกรม ข้อมูลนี้มักจะพบได้ในหน้าคู่มือของโปรแกรมที่ระบุ เช่น grep คำสั่งส่งคืน -1 หากไม่พบรายการที่ตรงกัน ซึ่งสามารถพิมพ์ข้อความในบรรทัด "ไม่พบไฟล์" อีกตัวอย่างหนึ่งคือคำสั่งในตัวของ Bash จริงซึ่งไม่ทำอะไรเลยนอกจากส่งคืนสถานะการออกเป็น 0 ซึ่งหมายถึงความสำเร็จ


ภาพ


4.1.5.3. สัญญาณ


กระบวนการสิ้นสุดเนื่องจากได้รับสัญญาณ มีหลายสัญญาณที่คุณสามารถส่งไปยังกระบวนการได้ ใช้ ฆ่า คำสั่งเพื่อส่งสัญญาณไปยังกระบวนการ คำสั่ง ฆ่า -l แสดงรายการสัญญาณ สัญญาณส่วนใหญ่ใช้สำหรับระบบภายใน หรือสำหรับโปรแกรมเมอร์เมื่อเขียนโค้ด ในฐานะผู้ใช้ คุณจะต้องมีสัญญาณต่อไปนี้:


ตารางที่ 4-2. สัญญาณทั่วไป


ชื่อสัญญาณ

หมายเลขสัญญาณ

ความหมาย

ซิกเทอร์ม

15

ยุติกระบวนการอย่างเป็นระเบียบ

ซิกนต์

2

ขัดจังหวะกระบวนการ กระบวนการสามารถละเว้นสัญญาณนี้

ซิกกิล

9

ขัดจังหวะกระบวนการ กระบวนการไม่สามารถละเลยสัญญาณนี้

ซิกอัพ

1

สำหรับ daemons: อ่านไฟล์คอนฟิกูเรชันอีกครั้ง

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการดำเนินการเริ่มต้นที่เกิดขึ้นเมื่อส่งสัญญาณไปยังกระบวนการใน มนุษย์ 7 สัญญาณ.


ภาพ

4.1.6. SUID และ SGID


ตามที่ได้สัญญาไว้ในบทที่แล้ว เราจะพูดถึงโหมดพิเศษ SUID และ SGID โดยละเอียดยิ่งขึ้น โหมดเหล่านี้มีไว้เพื่อให้ผู้ใช้ทั่วไปสามารถดำเนินการงานที่ปกติจะไม่สามารถทำได้เนื่องจากรูปแบบการอนุญาตไฟล์ที่เข้มงวดซึ่งใช้บนระบบที่ใช้ UNIX ในสถานการณ์ในอุดมคติ โหมดพิเศษจะถูกใช้อย่างเบาบางที่สุดเท่าที่จะเป็นไปได้ เนื่องจากมีความเสี่ยงด้านความปลอดภัย นักพัฒนา Linux มักจะพยายามหลีกเลี่ยงสิ่งเหล่านี้ให้มากที่สุด ลินุกซ์ ps เวอร์ชัน เช่น ใช้ข้อมูลที่จัดเก็บไว้ใน / proc ระบบไฟล์ซึ่งทุกคนสามารถเข้าถึงได้ ดังนั้นจึงหลีกเลี่ยงการเปิดเผยข้อมูลระบบที่ละเอียดอ่อนและทรัพยากรต่อสาธารณชนทั่วไป ก่อนหน้านั้นและยังคงอยู่ในระบบ UNIX ที่เก่ากว่า ps โปรแกรมจำเป็นต้องเข้าถึงไฟล์เช่น / dev / mem และ / dev / kmemซึ่งมีข้อเสียเนื่องจากการอนุญาตและความเป็นเจ้าของในไฟล์เหล่านี้:


ริต้า:~> ls

crw-r -----

-l

/dev/*บันทึก

ราก 1


กม


1,


2 ส.ค. 30 22:30 /dev/kmem

crw-r -----

ราก 1

กม

1,

1 ส.ค. 30 22:30 /dev/mem

ด้วยเวอร์ชันเก่าของ psมันเป็นไปไม่ได้ที่จะเริ่มต้นโปรแกรมในฐานะผู้ใช้ทั่วไป เว้นแต่ว่าจะใช้โหมดพิเศษกับมัน


ภาพ

แม้ว่าโดยทั่วไปแล้วเราจะพยายามหลีกเลี่ยงการใช้โหมดพิเศษใดๆ แต่บางครั้งก็จำเป็นต้องใช้ SUID ตัวอย่างคือกลไกในการเปลี่ยนรหัสผ่าน แน่นอนว่าผู้ใช้จะต้องการดำเนินการนี้เอง แทนที่จะกำหนดให้ผู้ดูแลระบบตั้งรหัสผ่านไว้ ดังที่เราทราบ ชื่อผู้ใช้และรหัสผ่านอยู่ในรายการ / etc / passwd ไฟล์ซึ่งมีสิทธิ์การเข้าถึงและเจ้าของเหล่านี้:


bea:~> ls -l /etc/passwd

-rw-r--r-- 1 รูตรูต

1267 16 ม.ค. 14:43 /etc/passwd

bea:~> ls -l /etc/passwd

-rw-r--r-- 1 รูตรูต

อย่างไรก็ตาม ผู้ใช้จำเป็นต้องเปลี่ยนข้อมูลของตนเองในไฟล์นี้ได้ นี่คือความสำเร็จโดยการให้ passwd

โปรแกรมสิทธิ์พิเศษ:


เมีย:~> ซึ่ง passwd

passwd คือ /usr/bin/passwd

เมีย:~> ซึ่ง passwd

passwd คือ /usr/bin/passwd


เมีย:~> ls -l /usr/bin/passwd

-rs--x--x 1 รูท

13476 7 ส.ค. 06:03 /usr/bin/passwd*

เมีย:~> ls -l /usr/bin/passwd

-rs--x--x 1 รูท

ภาพ

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


โหมด SGID ในไฟล์ไม่ได้เกิดขึ้นเกือบเท่ากับ SUID เนื่องจาก SGID มักเกี่ยวข้องกับการสร้างกลุ่มพิเศษ อย่างไรก็ตาม ในบางกรณี เราต้องผ่านปัญหานี้เพื่อสร้างโซลูชันที่สวยงาม (อย่ากังวลเรื่องนี้มากเกินไป เพราะโดยปกติแล้วจะมีการสร้างกลุ่มที่จำเป็นขึ้นเมื่อทำการติดตั้ง) นี่เป็นกรณีของ เขียน และ ผนัง โปรแกรมที่ใช้ในการส่งข้อความไปยังเทอร์มินัลของผู้ใช้รายอื่น (ttys) NS เขียน คำสั่งเขียนข้อความถึงผู้ใช้คนเดียวในขณะที่ ผนัง เขียนถึงผู้ใช้ที่เชื่อมต่อทั้งหมด


ปกติไม่อนุญาตให้ส่งข้อความไปยังเทอร์มินัลของผู้ใช้รายอื่นหรือการแสดงผลแบบกราฟิก เพื่อหลีกเลี่ยงปัญหานี้ มีการสร้างกลุ่มซึ่งเป็นเจ้าของอุปกรณ์ปลายทางทั้งหมด เมื่อ เขียน และ ผนัง คำสั่งได้รับสิทธิ์ SGID คำสั่งจะทำงานโดยใช้สิทธิ์การเข้าถึงตามที่เกี่ยวข้องกับกลุ่มนี้ TTY ในตัวอย่าง เนื่องจากกลุ่มนี้มีสิทธิ์เขียนไปยังเทอร์มินัลปลายทาง ผู้ใช้ที่ไม่มีสิทธิ์ใช้เทอร์มินัลนั้นไม่ว่าด้วยวิธีใดๆ ก็สามารถส่งข้อความถึงเทอร์มินัลได้


ภาพ

ในตัวอย่างด้านล่าง ผู้ใช้ โจ ก่อนอื่นให้ค้นหาว่าผู้ติดต่อของเขาเชื่อมต่อกับเทอร์มินัลใดโดยใช้ ใคร สั่งการ. จากนั้นเขาก็ส่งข้อความถึงเธอโดยใช้ เขียน สั่งการ. ภาพประกอบยังเป็นสิทธิ์การเข้าถึงบน เขียน โปรแกรมและบนเทอร์มินัลที่ครอบครองโดยผู้ใช้ที่รับ: เป็นที่ชัดเจนว่านอกเหนือจากเจ้าของผู้ใช้ไม่ได้รับอนุญาตบนอุปกรณ์ยกเว้นเจ้าของกลุ่มซึ่งสามารถเขียนถึงมันได้


โจ้:~> ซึ่งเขียน

เขียนคือ /usr/bin/write


โจ้:~> ls -l /usr/bin/เขียน

-rwxr-sr-x 1 รูท tty

8744 5 ธันวาคม 00:55 /usr/bin/write*

โจ้:~> ซึ่งเขียน

เขียนคือ /usr/bin/write


โจ้:~> ls -l /usr/bin/เขียน

-rwxr-sr-x 1 รูท tty


โจ้:~> ใคร

เจนนี่ tty1

เจนนี่ pts/1

เจนนี่ pts/2

เจนนี่ pts/3

โจ pts/0

23 ม.ค. 11:41

23 ม.ค. 12:21 (:0)

23 ม.ค. 12:22 (:0)

23 ม.ค. 12:22 (:0)

20 ม.ค. 10:13 น. (lo.callhost.org)

โจ้:~> ใคร

เจนนี่ tty1

เจนนี่ pts/1

เจนนี่ pts/2

เจนนี่ pts/3

โจ pts/0


โจ้:~> ls -l /dev/tty1

crw ----w ---- 1 เจนนี่ tty 4,

1 ม.ค. 23 11:41 /dev/tty1

โจ้:~> ls -l /dev/tty1

crw ----w ---- 1 เจนนี่ tty 4,


โจ้:~> เขียนเจนนี่ tty1

เฮ้ เจนนี่ เราไปกินข้าวด้วยกันไหม

^C

โจ้:~> เขียนเจนนี่ tty1

เฮ้ เจนนี่ เราไปกินข้าวด้วยกันไหม

^C

ผู้ใช้งาน สัตว์ตัวเมีย ได้รับสิ่งนี้บนหน้าจอของเธอ:


ข้อความจาก [ป้องกันอีเมล] ที่ ptys/1 เวลา 12:36 น. ...เฮ้ เจนนี่ เรากินข้าวเที่ยงด้วยกันไหม?

EOF

ข้อความจาก [ป้องกันอีเมล] ที่ ptys/1 เวลา 12:36 น. ...เฮ้ เจนนี่ เรากินข้าวเที่ยงด้วยกันไหม?

EOF

หลังจากได้รับข้อความ คุณสามารถล้างเทอร์มินัลโดยใช้ปุ่ม Ctrl+L คีย์ผสม เพื่อที่จะไม่ได้รับข้อความเลย (ยกเว้นจากผู้ดูแลระบบ) ให้ใช้ปุ่ม ข้อความ สั่งการ. เพื่อดูว่าผู้ใช้ที่เชื่อมต่อรายใดยอมรับข้อความจากผู้อื่นใช้ ใคร -w. คุณลักษณะทั้งหมดได้รับการอธิบายอย่างครบถ้วนในหน้าข้อมูลของแต่ละคำสั่ง


ภาพชื่อกลุ่มอาจแตกต่างกัน

แบบแผนกลุ่มมีความเฉพาะเจาะจงสำหรับการแจกจ่าย การแจกแจงแบบอื่นอาจใช้ชื่ออื่นหรือวิธีแก้ไขอื่นๆ


ภาพ


ระบบปฏิบัติการคลาวด์คอมพิวติ้งยอดนิยมที่ OnWorks: