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

7
ทำไมเราต้องแยกเพื่อสร้างกระบวนการใหม่
ใน Unix ทุกครั้งที่เราต้องการสร้างกระบวนการใหม่เราแยกกระบวนการปัจจุบันสร้างกระบวนการลูกใหม่ซึ่งเหมือนกับกระบวนการแม่ จากนั้นเราทำการเรียกระบบ exec เพื่อแทนที่ข้อมูลทั้งหมดจากกระบวนการหลักด้วยกระบวนการนั้นสำหรับกระบวนการใหม่ เหตุใดเราจึงสร้างสำเนาของกระบวนการหลักในตอนแรกและไม่สร้างกระบวนการใหม่โดยตรง

3
เหตุใดฉันจึงไม่สามารถชนระบบของฉันด้วยการวางระเบิดได้
เมื่อเร็ว ๆ นี้ฉันได้ขุดข้อมูลเกี่ยวกับกระบวนการใน GNU / Linux และฉันได้พบกับระเบิดที่น่าอับอาย: :(){ : | :& }; : ในทางทฤษฎีมันควรจะทำซ้ำตัวเองอย่างไม่มีที่สิ้นสุดจนกว่าระบบจะหมดทรัพยากร ... อย่างไรก็ตามฉันได้ลองทดสอบทั้งในCLI DebianและGUI Mint distro และดูเหมือนว่าจะไม่ส่งผลกระทบต่อระบบมากนัก ใช่มีกระบวนการมากมายที่ถูกสร้างขึ้นและหลังจากนั้นไม่นานฉันก็อ่านในข้อความคอนโซลเช่น: bash: fork: ทรัพยากรไม่สามารถใช้งานได้ชั่วคราว bash: fork: ลองอีกครั้ง: ไม่มีกระบวนการลูก แต่หลังจากเวลาผ่านไปกระบวนการทั้งหมดเพิ่งถูกฆ่าและทุกอย่างกลับสู่ปกติ ฉันได้อ่านว่าulimitตั้งค่าจำนวนสูงสุดของกระบวนการต่อผู้ใช้ แต่ฉันไม่สามารถยกมันได้ไกลนัก ระบบป้องกันการระเบิดจากส้อมคืออะไร? ทำไมมันไม่ทำซ้ำตัวเองจนกว่าทุกอย่างจะหยุดหรืออย่างน้อยก็ล่าช้ามาก? มีวิธีที่จะทำให้ระบบพังด้วยส้อมระเบิดหรือไม่?
54 linux  process  fork  ulimit 

4
ทำไมบางครั้งโปรแกรมด้วย fork () บางครั้งก็พิมพ์ผลลัพธ์ออกมาหลาย ๆ ครั้ง?
ในโปรแกรม 1 Hello worldได้รับการพิมพ์เพียงครั้งเดียว แต่เมื่อฉันลบ \nและเรียกใช้ (โปรแกรม 2) ผลลัพธ์จะได้รับการพิมพ์ 8 ครั้ง ใครช่วยอธิบายความสำคัญของ\nที่นี่กับมันได้fork()อย่างไร โปรแกรม 1 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { printf("hello world...\n"); fork(); fork(); fork(); } เอาท์พุท 1: hello world... โปรแกรม 2 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { printf("hello world..."); …
50 c  fork 

2
ทำไมส้อมกลไกการสร้างกระบวนการเริ่มต้นคืออะไร?
การเรียกใช้ระบบ UNIX สำหรับการสร้างกระบวนการ fork () สร้างกระบวนการลูกโดยการคัดลอกกระบวนการหลัก ความเข้าใจของฉันคือสิ่งนี้มักจะตามมาด้วยการเรียกร้องให้ exec () เพื่อแทนที่พื้นที่หน่วยความจำของกระบวนการลูก (รวมถึงส่วนของข้อความ) การคัดลอกพื้นที่หน่วยความจำของผู้ปกครองในทางแยก () ดูเหมือนจะสิ้นเปลืองกับฉันเสมอ (แม้ว่าฉันจะรู้ว่าของเสียสามารถลดลงได้ด้วยการทำให้ส่วนหน่วยความจำคัดลอกตามการเขียนดังนั้นจึงคัดลอกเฉพาะพอยน์เตอร์เท่านั้น) มีใครรู้บ้างไหมว่าทำไมจึงต้องใช้วิธีการทำสำเนานี้สำหรับการสร้างกระบวนการ

4
อะไรคือความแตกต่างระหว่างการเรียกใช้โปรแกรมเป็น daemon และฟอร์กมันลงในพื้นหลังด้วย '&'
อะไรคือความแตกต่างในทางปฏิบัติจากมุมมองดูแลระบบเมื่อปรับใช้บริการบนระบบที่ใช้ระบบปฏิบัติการยูนิกซ์?

4
มีตัวแปร UNIX ใดบ้างที่กระบวนการลูกตายกับผู้ปกครอง?
ฉันได้ศึกษาพฤติกรรมเคอร์เนลของ Linux มาระยะหนึ่งแล้วและมันชัดเจนสำหรับฉันเสมอว่า: เมื่อกระบวนการตายเด็กทุกคนจะถูกส่งกลับไปที่initกระบวนการ (PID 1) จนกว่าพวกเขาจะตายในที่สุด อย่างไรก็ตามเมื่อเร็ว ๆ นี้มีคนที่มีประสบการณ์มากกว่าฉันด้วยเคอร์เนลบอกฉันว่า: เมื่อกระบวนการออกไปเด็กทุกคนในนั้นก็ตาย (ยกเว้นคุณใช้NOHUPในกรณีที่พวกเขากลับไปinit) ตอนนี้แม้ว่าฉันจะไม่เชื่อเรื่องนี้ฉันยังคงเขียนโปรแกรมง่าย ๆ เพื่อให้แน่ใจ ฉันรู้ว่าฉันไม่ควรพึ่งพาเวลา ( sleep) สำหรับการทดสอบเนื่องจากทุกอย่างขึ้นอยู่กับการจัดตารางกระบวนการ แต่สำหรับกรณีง่าย ๆ นี้ฉันคิดว่ามันค่อนข้างเพียงพอ int main(void){ printf("Father process spawned (%d).\n", getpid()); sleep(5); if(fork() == 0){ printf("Child process spawned (%d => %d).\n", getppid(), getpid()); sleep(15); printf("Child process exiting (%d => %d).\n", getppid(), getpid()); …
41 process  init  exit  fork 

3
การสร้างเธรดล้มเหลวด้วย“ ทรัพยากรไม่พร้อมใช้งานชั่วคราว” ด้วยเคอร์เนล 4.3
ฉันกำลังเรียกใช้เซิร์ฟเวอร์นักเทียบท่าบน Arch Linux (เคอร์เนล 4.3.3-2) พร้อมคอนเทนเนอร์หลายตัว ตั้งแต่รีบูตครั้งล่าสุดของฉันทั้งเซิร์ฟเวอร์นักเทียบท่าและโปรแกรมแบบสุ่มภายในคอนเทนเนอร์เกิดข้อผิดพลาดพร้อมกับข้อความว่าไม่สามารถสร้างเธรดหรือ (บ่อยกว่า) เพื่อแยก ข้อผิดพลาดที่เฉพาะเจาะจงจะแตกต่างกันขึ้นอยู่กับโปรแกรม Resource temporarily unavailableแต่ส่วนใหญ่ของพวกเขาดูเหมือนจะพูดถึงข้อผิดพลาดที่เฉพาะเจาะจง ดูที่ส่วนท้ายของโพสต์นี้เพื่อดูข้อความแสดงข้อผิดพลาด ขณะนี้มีคนจำนวนมากที่ได้รับข้อความแสดงข้อผิดพลาดนี้และมีคำตอบมากมาย สิ่งที่น่าผิดหวังจริงๆคือทุกคนดูเหมือนจะคาดเดาว่าปัญหาจะสามารถแก้ไขได้อย่างไร แต่ดูเหมือนว่าไม่มีใครที่จะชี้ให้เห็นว่าจะระบุสาเหตุของปัญหาที่อาจเกิดขึ้นได้บ้าง ฉันได้รวบรวมสาเหตุที่เป็นไปได้ 5 ข้อสำหรับข้อผิดพลาดและวิธีการตรวจสอบว่าไม่มีอยู่ในระบบของฉัน: มีข้อ จำกัด ทั้งระบบเกี่ยวกับจำนวนเธรดที่กำหนดค่าใน/proc/sys/kernel/threads-max( ซอร์ส ) 60613ในกรณีของฉันนี้ถูกตั้งค่า ทุกเธรดใช้พื้นที่บางส่วนในสแต็ก ขีด จำกัด ขนาดสแต็กถูกกำหนดค่าโดยใช้ulimit -s( แหล่งที่มา ) ข้อ จำกัด สำหรับเปลือกของฉันเคยเป็น8192แต่ฉันได้เพิ่มมันโดยใส่* soft stack 32768เข้าไป/etc/security/limits.confดังนั้นulimit -sตอนนี้มันกลับ32768มา ฉันได้เพิ่มมันสำหรับกระบวนการนักเทียบท่าด้วยการใส่LimitSTACK=33554432ลงไป/etc/systemd/system/docker.service( แหล่งที่มาและฉันตรวจสอบว่าข้อ จำกัด ที่ใช้โดยการดู/proc/<pid of docker>/limitsและโดยการทำงานulimit -sภายในคอนเทนเนอร์นักเทียบท่า ทุกเธรดใช้หน่วยความจำบางส่วน ulimit -vวงเงินหน่วยความจำเสมือนมีการกำหนดค่าการใช้ …
39 linux  docker  limit  fork  thread 

3
Fork vs Clone บน 2.6 Kernel Linux
ฉันมีความสับสนเกี่ยวกับส้อมและโคลน ฉันได้เห็นว่า: fork เป็นกระบวนการและโคลนสำหรับเธรด fork เพียงเรียกการโคลน clone ถูกใช้สำหรับกระบวนการและเธรดทั้งหมด ถูกต้องหรือไม่ อะไรคือความแตกต่างระหว่าง 2 syscalls ที่มีเคอร์เนล 2.6 Linux?
37 linux  fork 

3
fork: ลองอีกครั้ง: ทรัพยากรไม่สามารถใช้งานได้ชั่วคราว
ขณะที่ฉันเชื่อมต่อกับเซิร์ฟเวอร์ฉันจะได้รับ -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: Resource temporarily unavailable และฉันลองทำตามคำสั่งแล้วผลลัพธ์ก็เหมือนกัน -bash-4.1$ df -h -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource …
31 linux  fork 

3
fork () คัดลอก heap ของกระบวนการทั้งหมดใน Linux ทันทีหรือไม่
การfork()เรียกระบบโคลนกระบวนการลูกจากกระบวนการทำงาน กระบวนการทั้งสองนั้นเหมือนกันยกเว้น PID ตามธรรมชาติแล้วหากกระบวนการเพิ่งอ่านจากกองของพวกเขามากกว่าที่จะเขียนลงไปการคัดลอกฮีปนั้นจะเป็นการสูญเสียความทรงจำครั้งใหญ่ คัดลอกฮีปกระบวนการทั้งหมดหรือไม่ มันได้รับการปรับให้เหมาะสมในวิธีที่เขียนเฉพาะการทริกเกอร์สำเนาฮีป
30 linux  fork 

3
คุณต้องการ 'nohup' เมื่อใดหากคุณใช้ '&' ไปแล้ว?
ครั้งแรกคำถามนี้เกี่ยวข้อง แต่ไม่เหมือนคำถามนี้ดีมาก: ความแตกต่างระหว่าง nohup, บอกเลิกและ & ฉันต้องการที่จะเข้าใจบางสิ่งบางอย่าง: เมื่อฉันทำ '&' ฉันกำลังฟาดฟันใช่มั้ย มีประโยชน์ไหมที่จะทำ "nohup ... &" หรือเพียงแค่ & เพียงพอ มีคนแสดงกรณีที่คุณใช้ '&' และยังต้องการใช้ 'nohup' หรือไม่
26 shell  nohup  fork 

3
ทุบตีรองรับการฟอร์กคล้ายกับส้อมของ C หรือไม่?
ฉันมีสคริปต์ที่ฉันต้องการแยกไว้ที่จุดหนึ่งเพื่อให้สคริปต์เดียวกันทำงานสองชุด ตัวอย่างเช่นฉันต้องการสคริปต์ทุบตีต่อไปนี้: echo $$ do_fork() echo $$ หากสคริปต์ทุบตีนี้มีอยู่จริงผลลัพธ์ที่คาดหวังจะเป็น: <ProcessA PID> <ProcessB PID> <ProcessA PID> หรือ <ProcessA PID> <ProcessA PID> <ProcessB PID> มีบางอย่างที่ฉันสามารถแทนที่ "do_fork ()" เพื่อรับเอาต์พุตชนิดนี้หรือทำให้สคริปต์ทุบตีทำส้อม C-like ได้หรือไม่
25 shell  fork 

3
copy-on-write in fork () จัดการหลาย fork อย่างไร
ตาม Wikipedia (ซึ่งอาจผิด) เมื่อมีการออกการเรียกระบบ fork () สำเนาของหน้าทั้งหมดที่เกี่ยวข้องกับกระบวนการหลักจะถูกสร้างขึ้นโหลดลงในตำแหน่งหน่วยความจำแยกต่างหากโดยระบบปฏิบัติการสำหรับกระบวนการลูก แต่นี่ไม่จำเป็นในบางกรณี พิจารณากรณีที่เมื่อเด็กรัน " exec" ระบบโทร (ที่ใช้ในการเรียกใช้ไฟล์ปฏิบัติการใด ๆ จากภายในโปรแกรม C) หรือออกในเร็ว ๆ fork()นี้หลังจากที่ เมื่อเด็กต้องการเพียงแค่เรียกใช้คำสั่งสำหรับกระบวนการหลักไม่จำเป็นต้องคัดลอกเพจกระบวนการหลักเนื่องจากexecแทนที่พื้นที่ที่อยู่ของกระบวนการที่เรียกใช้งานด้วยคำสั่งที่จะดำเนินการ ในกรณีเช่นนี้จะใช้เทคนิคที่เรียกว่า copy-on-write (COW) ด้วยเทคนิคนี้เมื่อมีการแยกหน้าเพจของกระบวนการหลักจะไม่ถูกคัดลอกสำหรับกระบวนการลูก แต่จะมีการแชร์หน้าระหว่างเด็กและกระบวนการหลักแทน เมื่อใดก็ตามที่กระบวนการ (พาเรนต์หรือชายด์) แก้ไขเพจสำเนาที่แยกต่างหากของเพจนั้นจะถูกสร้างขึ้นสำหรับกระบวนการนั้น (พาเรนต์หรือชายด์) ซึ่งดำเนินการแก้ไข กระบวนการนี้จะใช้เพจที่คัดลอกใหม่แทนที่จะเป็นเพจที่แชร์ในการอ้างอิงในอนาคตทั้งหมด กระบวนการอื่น (กระบวนการที่ไม่ได้แก้ไขเพจที่ใช้ร่วมกัน) ยังคงใช้สำเนาต้นฉบับของหน้าต่อไป (ซึ่งตอนนี้ไม่ได้ถูกแชร์อีกต่อไป) เทคนิคนี้เรียกว่า copy-on-write เนื่องจากหน้าจะถูกคัดลอกเมื่อบางกระบวนการเขียนไป ดูเหมือนว่าเมื่อกระบวนการอย่างใดอย่างหนึ่งพยายามที่จะเขียนไปยังหน้าสำเนาใหม่ของหน้าได้รับการจัดสรรและกำหนดให้กับกระบวนการที่สร้างความผิดหน้า หน้าเดิมได้รับการทำเครื่องหมายว่าสามารถเขียนได้ในภายหลัง คำถามของฉันคือจะเกิดอะไรขึ้นหากการfork()เรียกถูกเรียกหลายครั้งก่อนที่กระบวนการใด ๆ พยายามเขียนลงในเพจที่ใช้ร่วมกัน?
23 linux  c  fork 

1
ส้อมระเบิดทำงานอย่างไร
คำเตือนอย่าพยายามเรียกใช้สิ่งนี้บนเครื่องผลิต ในการอ่านหน้า Wikipedia ในหัวข้อฉันมักจะติดตามสิ่งที่เกิดขึ้นด้วยรหัสต่อไปนี้: :(){ :|:& };: ตัดตอนมาจากคำอธิบาย ระเบิดส้อมต่อไปนี้ถูกนำเสนอเป็นศิลปะในปี 2002;56 แหล่งกำเนิดที่แน่นอนของมันไม่เป็นที่รู้จัก แต่มันอยู่บน Usenet ปี 2002 ก่อนที่จะระเบิดจะถูกดำเนินการโดยการวางต่อไปนี้ 13 ตัวเป็น UNIXเปลือกเช่นทุบตีหรือzsh มันทำงานโดยการกำหนดฟังก์ชั่นที่เรียกว่า ':' ซึ่งเรียกตัวเองว่าสองครั้งหนึ่งครั้งในเบื้องหน้าและอีกครั้งในพื้นหลัง อย่างไรก็ตามบิตสุดท้ายไม่ชัดเจนสำหรับฉัน ฉันเห็นนิยามของฟังก์ชัน: :(){ ... } แต่จะเกิดอะไรขึ้น นอกจากนี้ยังทำหอยอื่น ๆ เช่นksh, cshและtcshยังประสบชะตากรรมเดียวกันของความสามารถที่จะสร้างบางสิ่งบางอย่างที่คล้ายกัน?
22 bash  shell-script  zsh  fork 

4
หลังจาก fork () เด็กจะเริ่มต้นการดำเนินการที่ใด
ฉันพยายามเรียนรู้การเขียนโปรแกรม UNIX และพบคำถามเกี่ยวกับ fork () ฉันเข้าใจว่า fork () สร้างกระบวนการที่เหมือนกันของกระบวนการที่กำลังทำงานอยู่ แต่มันเริ่มต้นที่ไหน ตัวอย่างเช่นถ้าฉันมีรหัส int main (int argc, char **argv) { int retval; printf ("This is most definitely the parent process\n"); fflush (stdout); retval = fork (); printf ("Which process printed this?\n"); return (EXIT_SUCCESS); } ผลลัพธ์คือ: นี่เป็นกระบวนการสำหรับผู้ปกครองแน่นอนที่สุดกระบวนการ ใดที่พิมพ์ออกมานี้ กระบวนการใดพิมพ์ ฉันคิดว่ามันfork()สร้างกระบวนการเดียวกันดังนั้นตอนแรกฉันก็เลยว่าในโปรแกรมนั้นการfork()โทรจะถูกเรียกซ้ำตลอดไป ฉันเดาว่ากระบวนการใหม่ที่สร้างขึ้นจากการfork()เริ่มต้นหลังจากการfork()โทร? ถ้าฉันเพิ่มรหัสต่อไปนี้เพื่อแยกความแตกต่างระหว่างกระบวนการหลักและลูก if …
22 process  c  fork  api 

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