คำถามติดแท็ก fork

6
ประมวลผลลูกหลาน
ฉันกำลังพยายามสร้างที่เก็บกระบวนการ คอนเทนเนอร์จะเรียกโปรแกรมอื่น ๆ ตัวอย่างเช่น - สคริปต์ทุบตีที่เปิดใช้งานพื้นหลังที่มีการใช้ '&' คุณสมบัติที่สำคัญที่ฉันตามมาคือเมื่อฉันฆ่าตู้คอนเทนเนอร์ทุกอย่างที่ได้รับมาจากกระบอกไม้ไผ่ควรจะถูกฆ่า ไม่เพียง แต่กำกับดูแลลูกหลาน แต่รวมถึงลูกหลานด้วย เมื่อฉันเริ่มโครงการนี้ฉันเชื่ออย่างผิด ๆ ว่าเมื่อคุณฆ่ากระบวนการเด็ก ๆ ก็ถูกฆ่าโดยอัตโนมัติเช่นกัน ฉันขอคำแนะนำจากผู้ที่มีความคิดที่ไม่ถูกต้องเหมือนกัน ในขณะที่เป็นไปได้ที่จะจับสัญญาณและส่งต่อการฆ่าให้กับเด็กนั่นไม่ใช่สิ่งที่ฉันกำลังมองหาที่นี่ ฉันเชื่อว่าสิ่งที่ฉันต้องการจะประสบความสำเร็จเพราะเมื่อคุณปิด xterm สิ่งใดก็ตามที่ทำงานอยู่ภายในมันจะถูกฆ่าเว้นแต่ว่ามันจะไม่เป็นเช่นนั้น ซึ่งรวมถึงกระบวนการที่ถูกโยงถึง นั่นคือสิ่งที่ฉันต้องการสร้างใหม่ ฉันมีความคิดว่าสิ่งที่ฉันกำลังพูดถึงเกี่ยวข้องกับเซสชันของยูนิกซ์ หากมีวิธีที่เชื่อถือได้ในการระบุการสืบทอดทั้งหมดของกระบวนการมันจะมีประโยชน์ที่จะสามารถส่งสัญญาณตามอำเภอใจได้เช่นกัน เช่น SIGUSR1

4
จะส่งรหัสผ่านไปยังกระบวนการลูกได้อย่างไร
การส่งรหัสผ่านบนบรรทัดคำสั่ง (ไปยังกระบวนการย่อยที่เริ่มต้นจากโปรแกรมของฉัน) นั้นไม่ปลอดภัย (เนื่องจากผู้ใช้รายอื่นสามารถใช้คำสั่ง ps) ตกลงเพื่อส่งเป็นตัวแปรสภาพแวดล้อมแทนหรือไม่? มีอะไรอีกบ้างที่ฉันสามารถใช้ผ่านมันได้? (ยกเว้นตัวแปรสภาพแวดล้อม) โซลูชันที่ง่ายที่สุดดูเหมือนว่าจะใช้ไพพ์ แต่โซลูชันที่ง่ายที่สุดนี้ไม่ใช่เรื่องง่าย ฉันโปรแกรมใน Perl

4
fork และ exec ทำงานอย่างไร
ฉันไม่ได้มีประสบการณ์มากนักเพียงแค่พยายามเข้ามามีส่วนร่วมในกระบวนการต่าง ๆ พวกเขาตีความถึงฮาร์ดแวร์จากระดับผู้ใช้อย่างไร ดังนั้นเมื่อคำสั่งถูกไล่ออกจากเชลล์ให้fork()สืบทอดกระบวนการลูกของมันและexec()โหลดกระบวนการลูกไปยังหน่วยความจำและดำเนินการ หากกระบวนการลูกมีคุณลักษณะทั้งหมดของกระบวนการหลัก (ซึ่งเป็นกระบวนการดั้งเดิม) ดังนั้นความต้องการของกระบวนการลูกนี้คืออะไร? กระบวนการต้นฉบับอาจถูกโหลดไปยังหน่วยความจำ สิ่งนี้forkและexecแนวคิดนี้ใช้กับโปรแกรมปฏิบัติการทั้งหมดใน UNIX หรือไม่? ชอบเชลล์สคริปต์หรือเพียงแค่คำสั่ง? มันใช้กับคำสั่ง shell builtin หรือไม่? การคัดลอกเมื่อเขียนแนวคิดที่ใช้ถ้าฉันจะรันคำสั่ง / สคริปต์หรือไม่ ขออภัยที่ถามคำถามหลายครั้ง แต่คำถามเหล่านี้มาถึงใจของฉันทันทีเมื่อฉันคิดเกี่ยวกับการดำเนินการคำสั่งใด ๆ
17 fork  exec 

1
เหตุใด bash fork bombs จึงทำงานต่างกันและความสำคัญของมันคืออะไร?
ฉันรู้ว่า Fork fork แบบธรรมดาทำงานได้อย่างไร แต่ฉันไม่เข้าใจว่าทำไม & ในตอนท้ายของการวางระเบิด bash fork ทั่วไปและทำไมสคริปต์เหล่านี้จึงมีความแตกต่าง: :(){ (:) | (:) }; : และ :(){ : | :& }; : อดีตทำให้การใช้งาน cpu ขัดขวางก่อนที่จะทิ้งฉันกลับไปที่หน้าจอเข้าสู่ระบบ หลังทำให้ระบบของฉันค้างแข็งแทนที่จะบังคับให้ฉันรีบูตยาก ทำไมถึงเป็นอย่างนั้น? ทั้งสองอย่างต่อเนื่องสร้างกระบวนการใหม่ดังนั้นทำไมระบบทำงานแตกต่างกันอย่างไร สคริปต์ทั้งสองยังทำงานแตกต่างจาก :(){ : | : }; : ซึ่งไม่ได้ทำให้เกิดปัญหาใด ๆ เลยถึงแม้ว่าฉันจะคาดหวังให้พวกเขาเหมือนกัน หน้าคู่มือทุบตีระบุว่าคำสั่งในไปป์ไลน์ถูกดำเนินการแล้วใน subshell ดังนั้นฉันจึงเชื่อว่า: | : ควรเพียงพอแล้ว ฉันเชื่อ & ควรเรียกใช้ไปป์ไลน์ใน subshell ใหม่ …

3
ทำไม fork () ได้รับการออกแบบมาเพื่อคืน file descriptor?
เมื่อเขาหน้าเว็บเกี่ยวกับเคล็ดลับท่อตนเองแดน Bernstein อธิบายสภาพการแข่งขันด้วยselect()และสัญญาณข้อเสนอการแก้ปัญหาและสรุปว่า แน่นอนว่าสิ่งที่ถูกต้องคือการfork()ส่งคืนไฟล์อธิบายไม่ใช่รหัสกระบวนการ เขาหมายความว่าอย่างไร - เป็นเรื่องเกี่ยวกับความสามารถselect()ในกระบวนการลูกเพื่อจัดการการเปลี่ยนแปลงสถานะของพวกเขาแทนที่จะต้องใช้เครื่องจัดการสัญญาณเพื่อรับการแจ้งเตือนการเปลี่ยนแปลงสถานะเหล่านั้นหรือไม่

1
เปลือกทั่วไป“ ส้อมระเบิด” เรียกตัวเองว่าสองครั้งอย่างแน่นอนอย่างไร?
หลังจากผ่านคำถาม Fork Bombที่โด่งดังใน Askubuntu และเว็บไซต์แลกเปลี่ยนเงินตราต่างประเทศอื่น ๆ ฉันไม่เข้าใจว่าสิ่งที่ทุกคนพูดถึงมันชัดเจน คำตอบมากมาย ( ตัวอย่างที่ดีที่สุด ) พูดอย่างนี้: " {:|: &}หมายถึงเรียกใช้ฟังก์ชัน:และส่งออกไปยัง:ฟังก์ชันอีกครั้ง" ดีสิ่งที่แน่นอนคือการส่งออกของ:? สิ่งที่ถูกส่งผ่านไปยังอีก:หรือไม่ และนอกจากนี้ยังมี: โดยพื้นฐานแล้วคุณกำลังสร้างฟังก์ชั่นที่เรียกตัวเองว่าสองครั้งทุกการโทรและไม่มีทางที่จะยุติตัวเอง วิธีการที่ถูกดำเนินการสองครั้งว่า? ในความคิดของฉันไม่มีอะไรถูกส่งผ่านไปยังวินาที:จนกว่าการดำเนินการครั้งแรกจะ:เสร็จสิ้นซึ่งจริงๆแล้วจะไม่มีวันสิ้นสุด ในCตัวอย่างเช่น foo() { foo(); foo(); // never executed } ที่สองfoo()ไม่ได้ดำเนินการเลยเพียงเพราะครั้งแรกfoo()ไม่สิ้นสุด ฉันคิดว่าตรรกะเดียวกันนี้ใช้ได้กับ:(){ :|: & };:และ :(){ : & };: ทำงานเช่นเดียวกับ :(){ :|: & };: โปรดช่วยฉันเข้าใจตรรกะ

2
อธิบายไฟล์และทางแยก
เมื่อเด็กถูกแยกแล้วมันจะสืบทอดตัวบ่งชี้ไฟล์ของผู้ปกครองถ้าเด็กปิดตัวอธิบายไฟล์จะเกิดอะไรขึ้น? หากเด็กเริ่มเขียนสิ่งที่จะเกิดขึ้นกับไฟล์ที่ส่วนท้ายของผู้ปกครอง? ใครเป็นผู้จัดการความไม่สอดคล้องกันเคอร์เนลหรือผู้ใช้เหล่านี้ เมื่อกระบวนการเรียกใช้closeฟังก์ชันเพื่อปิดไฟล์ที่เปิดเฉพาะผ่าน file descriptor ในตารางไฟล์ของกระบวนการจำนวนการอ้างอิงจะลดลงหนึ่งรายการ แต่เนื่องจากพาเรนต์และชายด์กำลังถือไฟล์เดียวกันการนับการอ้างอิงคือ 2 และหลังจากปิดจึงลดลงเหลือ 1 เนื่องจากกระบวนการไม่เป็นศูนย์กระบวนการยังคงใช้ไฟล์ต่อโดยไม่มีปัญหาใด ๆ ดูที่การเขียนโปรแกรมระบบ UNIX ของ Terrence Chan (รองรับเคอร์เนล Unix สำหรับไฟล์)

6
ทำไม“ ls” จึงต้องการกระบวนการแยกต่างหากสำหรับการดำเนินการ
เหตุใดจึงlsต้องมีกระบวนการแยกต่างหากสำหรับการดำเนินการ ฉันรู้ว่าสาเหตุที่คำสั่งเช่นcdไม่สามารถดำเนินการได้โดยกลไกการฟอร์กกิ้ง แต่มีอันตรายใด ๆ หากlsถูกสั่งการโดยไม่ฟอร์กกิ้ง?
14 ls  cd-command  fork 

1
fork () และสัญญาณถูกส่งไปยังกระบวนการอย่างไร
ฉันโปรแกรมที่ฉันเขียนใน C fork () ปิดกระบวนการลูก กระบวนการจะไม่ยุติ ถ้าฉันเปิดโปรแกรมจากบรรทัดคำสั่งและกด control-c กระบวนการใดที่จะได้รับสัญญาณขัดจังหวะ?
13 process  signals  fork 

5
วิธีแยกคำสั่งเชลล์ทั้งหมดที่ใช้การเปลี่ยนเส้นทางโดยสิ้นเชิง
ผมเคยเขียนค่อนข้างเชลล์สคริปต์ไม่กี่ปีที่ผ่านมา ( แต่ฉันไม่แน่นอนดูแลระบบ) และมีบางสิ่งบางอย่างที่ทำให้เกิดปัญหาเสมอฉัน: ฉันจะแยกเปลือกคำสั่งภูมิคุ้มกัน hangups ในพื้นหลังจากที่ทุบตีสคริปต์? เช่นถ้าฉันมีสิ่งนี้: command_which_takes_time input > output ฉันจะ "nohup" และแยกสิ่งนี้ได้อย่างไร ต่อไปนี้ดูเหมือนจะไม่ทำสิ่งที่ฉันต้องการ: nohup command_which_takes_time input > output & ฉันกำลังค้นหาไวยากรณ์อะไรและฉันไม่เข้าใจอะไร
13 bash  scripting  nohup  fork 

2
ความแตกต่างระหว่าง fork () และ vfork () คืออะไร
ฉันต้องการที่จะเข้าใจในรายละเอียดความแตกต่างระหว่าง fork () และ vfork () ฉันไม่สามารถแยกแยะหน้าคนได้อย่างสมบูรณ์ ฉันต้องการชี้แจงเพื่อนร่วมงานคนหนึ่งให้ความเห็นว่า " ใน Linux ปัจจุบันไม่มี vfork () แม้ว่าคุณจะเรียกมันว่ามันจะเรียกส้อมภายใน () "

1
ksh93 หลีกเลี่ยงการส้อมในการทดแทนคำสั่งได้อย่างไร
ป.ร. ให้ไว้ cmd='fun(){ echo "$@"; }; fun $(fun $(fun hi))' หอยมีแนวโน้มที่จะต้องทำให้ 2 ส้อมเพื่อให้มันเกิดขึ้น strace-f(){ strace -f "$@" 2>&1; }; for sh in dash bash zsh ksh; do printf "$sh\t" ; strace-f $sh -c "$cmd" |grep -e clone -e fork -c; done ยกเว้นkshอย่างกล้าหาญทำให้มันไม่ได้ฟอร์กครั้งเดียว: dash 2 bash 2 zsh 2 ksh 0 …

3
เมื่อกระบวนการใดคัดลอกหน่วยความจำเสมือนหรือหน่วยความจำในเครื่อง
วิธีมาตรฐานในการสร้างกระบวนการใหม่ใน Linux คือ footprint หน่วยความจำของกระบวนการหลักถูกคัดลอกและกลายเป็นสภาพแวดล้อมของกระบวนการลูกจนกว่าexecvจะมีการเรียกใช้ สิ่งที่เรากำลังพูดถึงรอยเท้าหน่วยความจำเสมือน (สิ่งที่กระบวนการร้องขอ) หรือคนที่อาศัยอยู่ (สิ่งที่ใช้จริง)? แรงจูงใจ: ฉันมีอุปกรณ์ที่มีพื้นที่สว็อป จำกัด และแอปพลิเคชันที่มีความแตกต่างอย่างมากระหว่างพื้นที่หน่วยความจำเสมือนและที่อยู่อาศัย แอปพลิเคชันไม่สามารถแยกได้เนื่องจากหน่วยความจำไม่เพียงพอและต้องการดูว่าการพยายามลดขนาดรอยเท้าเสมือนจริงจะช่วยได้หรือไม่

4
ทำไมลูกของ vfork หรือ fork call _exit () แทนที่จะออก ()
จากหน้าคนของvfork(): vfork () แตกต่างจาก fork () ซึ่งผู้ปกครองจะถูกระงับจนกว่าเด็กจะเรียกร้องให้ execve (2) หรือ _exit (2) ชายด์แบ่งใช้หน่วยความจำทั้งหมดกับพาเรนต์รวมถึงสแต็กจนกว่า execve () จะออกโดยเด็ก เด็กต้องไม่ส่งคืนจากฟังก์ชันปัจจุบันหรือ call exit () แต่อาจเรียก _exit () ทำไมเด็กควรใช้_exit()มากกว่าเพียงแค่การเรียกร้องexit()? ฉันหวังว่านี้สามารถใช้ได้กับทั้งสองและvfork()fork()
12 c  system-calls  fork  exit 

4
เมื่อใดที่จะเรียก fork () และ exec () ด้วยตัวเอง?
ฉันเรียนรู้เกี่ยวกับคำสั่ง fork () และ exec () ดูเหมือนว่า fork () และ exec () มักจะถูกเรียกเข้าด้วยกัน (fork () สร้างกระบวนการลูกใหม่และ exec () แทนที่อิมเมจกระบวนการปัจจุบันด้วยอันใหม่) อย่างไรก็ตามในสถานการณ์ใดที่คุณอาจเรียกแต่ละฟังก์ชั่นด้วยตัวเอง มีสถานการณ์แบบนี้เหรอ?

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