Output dari panggilan fork()

Apa output dari panggilan fork() berikut?

func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}

Adakah yang bisa membantu saya mendapatkan jawaban atas kode ini serta beberapa penjelasan karena saya baru mengenal OS? Saya telah menemukan beberapa pertanyaan tentang fork() di SO, tetapi tidak dapat menemukan banyak jawaban.


person Prashant Singh    schedule 14.10.2012    source sumber
comment
Suatu hari nanti, saya akan membuat OS yang menampilkan Hentikan Kegilaan!! dan mati ketika 4 percabangan terjadi tanpa ada pemrosesan di antaranya.   -  person cHao    schedule 14.10.2012
comment
Ini bukan contoh praktis, hanya pertanyaan wawancara untuk menguji pemahaman   -  person Prashant Singh    schedule 14.10.2012
comment
Outputnya adalah banyak proses.   -  person nneonneo    schedule 14.10.2012
comment
@nneonneo Bisakah Anda menjelaskannya lebih lanjut? bagaimana itu akan terjadi?   -  person Prashant Singh    schedule 14.10.2012
comment
@cHao: OS X bekerja cukup baik dalam hal ini; forkbombs biasanya ditemui dengan Resource untuk sementara tidak tersedia.   -  person nneonneo    schedule 14.10.2012
comment
@PrashantSingh: Setiap fork() mengubah satu proses menjadi dua. Keduanya kemudian akan fork() lagi, dan sekarang Anda memiliki 4. Kemudian lagi, dan Anda memiliki 8. Setengah dari itu (proses induk) akan bercabang lagi, dan sekarang Anda memiliki 12. Dst.   -  person cHao    schedule 14.10.2012
comment
@PrashantSingh: Saya bercanda. Hasilnya adalah sejumlah besar proses dihasilkan, jadi Anda mungkin akan melihat Saikacollection dicetak berkali-kali. Saya tidak begitu mengerti gunanya mencoba menghitung berapa banyak, dan ini adalah pertanyaan wawancara yang sangat jelek.   -  person nneonneo    schedule 14.10.2012
comment
@cHao lihat jawaban yang akhirnya saya dapatkan.   -  person Prashant Singh    schedule 03.11.2012
comment
@nneonneo Lihat jawaban yang telah saya posting   -  person Prashant Singh    schedule 03.11.2012
comment
Serangan bom garpu! pergi ke tempat perlindungan bom!   -  person Linuxios    schedule 03.11.2012


Jawaban (3)


Saikacollection akan dicetak 40 kali sebagai output kode. Hal ini dapat dijelaskan sebagai berikut: -

Untuk memahami hasilnya, kita perlu mengetahui hal berikut: -

  • Jika panggilan fork() berhasil dieksekusi, anak baru akan dibuat. Proses pembuatan anak disebut parent process.
  • Panggilan Fork() mengembalikan pid (pengidentifikasi proses) dari anak ke orang tua
  • Fork() mengembalikan 0 ke proses anak.

masukkan deskripsi gambar di sini

Perhatikan gambar yang ditunjukkan: -

Konvensi : Semua orang tua (penelepon) dari proses ditulis ke left dan ditandai dengan star.

fork()
  • Pada awalnya, kita hanya memiliki 1 proses, jadi panggilan fork() akan membuat sebuah anak. Mengingat akar pohon sebagai level 1, kita dapat melihat di level 2, kita memiliki dua proses, parent(left) dan child(right) .

    fork()

  • fork() lagi-lagi menciptakan 4 proses seperti itu, ditandai sebagai 1, 2, 3, 4. Karena keempat proses tersebut akan melalui struktur kode yang serupa lebih lanjut, kita dapat mengatakan jumlah total proses akan menjadi 4 kali satu proses menghasilkan

    fork()&&fork()||fork()

  • Memahami pernyataan ini melibatkan, menyadari fakta bahwa dalam C, && operator has more precedence than ||

  • Juga, jika first dari dua operan yang digabungkan dengan && menjadi wrong, kita don't check the second. Demikian pula jika first dari dua operan || adalah true, maka we don't check the second operan.
  • Pertimbangkan, panggilan fork() pada 1(ditandai) node, dua proses dibuat. Sementara orang tua mendapat angka positif (pid) sebagai imbalannya, anak mendapat 0. Jadi, orang tua mengeksekusi operator kedua, sementara anak melompat ke fork() setelah || seperti yang ditandai pada gambar.
  • Eksekusi &&fork() untuk induk di level 4, mengembalikan pid untuk satu proses, yang berakhir, sedangkan anak dari langkah tersebut, mendapat 0. Jadi, ini berlaku untuk eksekusi ||fork()
  • panggilan ||fork() terakhir untuk anak level 5, selanjutnya menghasilkan proses sebagai hasilnya
  • Jadi, di akhir langkah, kita memiliki 5 daun (proses) seperti yang ditandai dengan garis bawah pada gambar.
  • Seandainya kita melakukan hal yang sama untuk ketiga node, kita bisa mendapatkan 5*4 = 20 proses.

    fork()

  • Final fork() hanya doubles jumlah proses yang tersedia pada langkah itu.

  • Jadi, jumlah proses = 2*20 = 40.
person Prashant Singh    schedule 03.11.2012

Saikacollection dicetak 32 kali dalam baris baru setiap saat.

person Sahil Sharma    schedule 15.10.2012
comment
Dengan asumsi OS menyinkronkan akses ke stdout antar proses. Jika tidak, Anda bisa saja berakhir dengan SSSSSSSSSSaaaaSaaaaaiSaaaaiiSSS... - person cHao; 15.10.2012
comment
Bisakah Anda menjelaskannya sedikit? - person Prashant Singh; 22.10.2012
comment
@ user1747039 Bukankah seharusnya 40, bukan 32. Saya pikir Anda membuat kesalahan di suatu tempat - person Prashant Singh; 02.11.2012

Jika Anda ingin proses baru menjadi lebih independen, Anda dapat melihat exec-* family of funcitons (POSIX) - sehingga Anda dapat melakukan fork, dan kemudian segera mengganti proses fork (Anda dapat melakukannya, karena proses fork yang baru dikontrol oleh Anda); Atau mungkin lihat popen() juga.

person user6856855    schedule 21.09.2016