Saya mencoba mempelajari pemrograman UNIX dan menemukan pertanyaan mengenai fork (). Saya mengerti bahwa fork () menciptakan proses identik dari proses yang sedang berjalan, tetapi di mana ia mulai? Misalnya, jika saya punya kode
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);
}
Outputnya adalah:
Ini jelas merupakan proses induk. Proses
mana yang mencetak ini?
Proses mana yang mencetak ini?
Saya pikir itu fork()
menciptakan proses yang sama, jadi saya awalnya bahwa dalam program itu, fork()
panggilan akan secara rekursif dipanggil selamanya. Saya kira proses baru dibuat dari fork()
awal setelah fork()
panggilan?
Jika saya menambahkan kode berikut, untuk membedakan antara proses induk dan anak,
if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());
setelah panggilan fork (), di mana proses anak memulai eksekusi?
man fork
cukup yakin untuk menjawab pertanyaan Anda, btwJawaban:
Proses baru akan dibuat dalam
fork()
panggilan, dan akan mulai dengan kembali darinya seperti induknya. Nilai pengembalian (tempat Anda menyimpanretval
) berasal darifork()
:Kode pengujian Anda berfungsi dengan benar; ia menyimpan nilai balik dari
fork()
dalamchild_pid
dan digunakanif
untuk memeriksa apakah 0 atau tidak (meskipun tidak memeriksa kesalahan)sumber
Iya nih. Mari beri nomor garis:
Alur eksekusi adalah:
... yang menjelaskan dengan tepat keluaran yang Anda terima.
Jika Anda ingin tahu bagaimana program asli dan bercabang mungkin dapat berperilaku berbeda, karena mereka harus berbagi kode yang sama, lihat jawaban Michael Mrozek.
sumber
Solusi nyata untuk ini adalah
sumber
apa pun kode setelah
fork()
, disalin ke proses anak, dan jangan campur proses induk dan anak, mereka adalah dua entitas yang berbeda, yang memiliki lingkungan yang sama (digandakan, tidak dibagi).Sekarang lihat output Anda ...
sumber