เด็กในโปรแกรมนี้จะทำงานอย่างไร?

ฉันไม่เข้าใจฟังก์ชัน fork อย่างถ่องแท้ ฉันไม่เข้าใจว่าพ่อและลูกประมวลผล contineo จากฟังก์ชัน fork() อย่างไร หรือข้ามบรรทัดนี้แล้วไปที่บรรทัดถัดไป ตัวอย่างเช่น:

int value = 0;
if (fork()!=0)
{
 wait(&value);
 value = WEXITSTATUS(value);
 value++;
}
printf("%d\n",value);
value+=2;
exit(value);

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


person Eli    schedule 13.04.2016    source แหล่งที่มา
comment
เกิดอะไรขึ้นเมื่อคุณลอง?   -  person Martin James    schedule 13.04.2016
comment
ฉันไม่ได้จริงๆ ฉันแค่พยายามเข้าใจ fork และจะเกิดอะไรขึ้นในฟังก์ชันนี้   -  person Eli    schedule 13.04.2016
comment
ทำไมคุณไม่ลองมัน? การรันมันจะต้องแสดงให้เห็นถึงการทำงานของมัน   -  person Martin James    schedule 13.04.2016
comment
ฉันกำลังเรียนรู้ระบบปฏิบัติการและฉันยังใหม่กับเรื่องทั้งหมดนี้ เลยไม่รู้ว่าต้องทำอย่างไร ฉันคิดว่าฉันต้องการ linux ที่ฉันไม่มี :/   -  person Eli    schedule 13.04.2016
comment
หากคุณกำลังเรียนรู้ระบบปฏิบัติการ ก่อนอื่นให้คิดว่าคุณควรตั้งค่าระบบ linux หรือ vm ใน windows ก่อน ฉันขอแนะนำให้คุณรันโปรแกรมก่อน และใช้ gdb และดีบักโปรแกรมที่คุณเขียน   -  person Sridhar Nagarajan    schedule 13.04.2016
comment
หนึ่งกระบวนการเรียก fork แต่จะส่งกลับในแต่ละกระบวนการจากสองกระบวนการ   -  person David Schwartz    schedule 13.04.2016
comment
ฉันไม่เข้าใจ - หากคุณไม่มีระบบปฏิบัติการและ/หรือซอร์สโค้ดที่คุณสร้างและทดสอบ..... โค้ดมาจากไหน   -  person Martin James    schedule 13.04.2016


คำตอบ (2)


โปรแกรมทั้งหมดซ้ำกันและทั้งพ่อและลูกเริ่มต้นจาก fork() พ่อเข้ามาข้างใน if เพราะค่าที่ส่งคืนทางแยกไม่ใช่ค่าว่าง และหลังจากไปที่

printf("%d\n",value);
value+=2;
exit(value);

ในขณะที่ลูกชายไปที่บรรทัดนี้ เพราะ pid เป็นศูนย์

ลูกชายออก 2 เนื่องจากบรรทัด value += 2

ตัวพ่อรอค่านั้น (เช่น ค่า = 2) เพิ่มขึ้น (ค่า = 3) แล้วบวก 2 (ค่า = 5)

person Boiethios    schedule 13.04.2016
comment
ถ้าฉันเข้าใจถูกต้องนั่นหมายความว่าหากกระบวนการลูกและพ่อใช้งานได้ผลลัพธ์จะเป็น: 0 และ 3 ? - person Eli; 13.04.2016

fork() โดยพื้นฐานแล้ว สร้างสำเนาของกระบวนการที่เรียกมัน

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

ยกเว้นกรณีนั้น ลูกจะอยู่ในสถานะเดียวกับพาเรนต์และดำเนินการดำเนินการต่อจากจุดเดียวกันกับพาเรนต์ นั่นคือการเรียกไปที่ fork()

person JimmyB    schedule 13.04.2016