PID หลังจาก fork() จะเป็นอย่างไร?

ฉันกำลังแยก 3 ครั้งติดต่อกันในโปรแกรม C
1. มันจะดำเนินการในลำดับเดียวกันหรือไม่? (ฉันเดาว่าใช่)
2. หากฉันทำ pgrep myexecutable จากเชลล์ มันจะให้รหัสกระบวนการในลำดับเดียวกับที่เริ่มต้นหรือไม่ (ฉันเดาว่าไม่เพราะคุณไม่สามารถรับประกันได้ว่าระบบจะให้ pid อะไรแก่เด็กใช่ไหม )


person Shrinath    schedule 15.02.2011    source แหล่งที่มา
comment
มันไม่สำคัญสำหรับโปรแกรมที่เหมาะสมใดๆ   -  person Lightness Races in Orbit    schedule 15.02.2011
comment
PID ของกระบวนการที่แยกล่าสุดคือ $! stackoverflow.com/a/25361436/6655092... ฉันพบคำถามนี้ในขณะที่ค้นหาจริง ๆ สำหรับ $! ฉันเลยคิดว่าจะโพสต์ไว้ที่นี่   -  person JakeD    schedule 26.05.2018


คำตอบ (2)


Shrinath คุณควรตรวจสอบเอกสารประกอบสำหรับ fork() นี่คือ:

Upon successful completion, fork() returns a value of 0 to the child
process and returns the process ID of the child process to the parent
process.  Otherwise, a value of -1 is returned to the parent process, no
child process is created, and the global variable errno is set to indi-
cate the error.

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

if((cpid = fork()))
{ 
  // This is the parent processs, child pid 
  // is in `cpid` variable
}else{
  // This is the child process, do your child
  // work here.
}

ระวังโอกาสที่คุณจะได้เลขลบ (ไม่มีลูก) คุณควรตรวจสอบสิ่งนั้น

ผลลัพธ์ของ ps จะแตกต่างกันไปตามระบบ แต่คุณควรเห็นตัวอย่าง หากคุณดูทั้งแผนผัง (ทำให้กระบวนการของคุณเข้าสู่โหมดสลีป เพื่อให้คุณมีเวลาตรวจสอบเอาต์พุต ps)

person Lee Hambley    schedule 15.02.2011
comment
โปรดอ่านคำถามอีกครั้งและบอกฉันว่าคำถามส่วนไหนไม่ชัดเจน... ฉันไม่ได้ถามว่าจะสร้างกระบวนการลูกได้อย่างไร หรือฉันจะรู้ pid ของเด็กได้อย่างไร... สิ่งที่ฉันถามคือ มันจะอยู่ในลำดับเดียวกันทุกครั้งหรือเปล่า? ขอบคุณสำหรับเวลาอันมีค่าของคุณ - person Shrinath; 15.02.2011

จะมีทั้งหมด 8 กระบวนการที่ทำงานหลังจากดำเนินการ 3 fork

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นตอนนี้ pid จะขึ้นอยู่กับลำดับที่กระบวนการลูกถูกสร้างขึ้นและลำดับการสร้างลูกของเด็กด้วย

อาจจะเป็นเช่นนั้น

main - 12345

child1_of_main_after_fork1  12346

child2_of_child1_after_fork2  12347

child3_of_main_after_fork2 12348

child4_of_main_after_fork3 12349

child5_of_child1_after_fork3 12350

child6_of_child2_after_fork3 12351

child7_of_child3_after_fork3 12352
person ayush    schedule 15.02.2011