Bom fork ini selalu mengingatkan saya pada sesuatu yang dikatakan oleh seorang guru pemrograman AI pada salah satu pelajaran pertama yang saya hadiri "Untuk memahami rekursi, pertama-tama Anda harus memahami rekursi".
Pada intinya, bom ini adalah fungsi rekursif . Intinya, Anda membuat fungsi, yang memanggil dirinya sendiri, yang memanggil dirinya sendiri, yang memanggil dirinya sendiri ... sampai sumber daya sistem dikonsumsi. Dalam contoh khusus ini, rekursi diperkuat dengan menggunakan fungsi perpipaan untuk dirinya sendiri DAN melatarbelakanginya.
Saya telah melihat ini dijawab di StackOverflow , dan saya pikir contoh yang diberikan di sana menggambarkan yang terbaik, hanya karena lebih mudah untuk melihat apa yang dilakukan sekilas (dicuri dari tautan di atas ...)
☃(){ ☃|☃& };☃
Tentukan fungsi bug ☃() { ... }
, tubuh yang memanggil dirinya sendiri (fungsi bug), memipakan output ke dirinya sendiri (fungsi bug) ☃|☃
, dan latar belakang hasilnya &
. Kemudian, setelah fungsi didefinisikan, sebenarnya memanggil fungsi bug ; ☃
,.
Saya perhatikan bahwa setidaknya pada Arch VM saya, kebutuhan untuk melatarbelakangi proses bukanlah keharusan untuk memiliki hasil akhir yang sama, untuk menggunakan semua ruang proses yang tersedia dan membuat host menjadi b0rked. Sebenarnya sekarang saya sudah mengatakan bahwa kadang-kadang tampaknya menghentikan proses lari dan setelah layar -bash: fork: Resource temporarily unavailable
itu akan berhenti dengan Terminated
(dan journalctl
menunjukkan bash core dumping).
Untuk menjawab pertanyaan Anda tentang csh / tcsh, tidak satu pun dari fungsi kerang yang mendukung, Anda hanya bisa alias. Jadi untuk kerang itu Anda harus menulis skrip shell yang menyebut dirinya secara rekursif.
zsh tampaknya mengalami nasib yang sama (dengan kode yang sama), tidak membuang inti dan menyebabkan Arch untuk memberikan Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, tetapi masih terus bercabang. Setelah beberapa saat kemudian menyatakan Killed process 162 (systemd-logind) ...
(dan masih terus memiliki zsh forking).
Arch sepertinya tidak memiliki pacman
versi ksh, jadi saya harus mencobanya di debian. ksh objek :
sebagai nama fungsi, tetapi menggunakan sesuatu - katakan b()
saja tampaknya memiliki hasil yang diinginkan.