- PERINGATAN JANGAN MENJALANKAN INI PADA MESIN PRODUKSI
Saat membaca halaman Wikipedia tentang topik ini, saya biasanya mengikuti apa yang terjadi dengan kode berikut:
:(){ :|:& };:
kutipan deskripsi
Bom fork berikut disajikan sebagai karya seni pada tahun 2002;56 asal pastinya tidak diketahui, tetapi ada di Usenet sebelum tahun 2002. Bom dieksekusi dengan menempelkan 13 karakter berikut ke dalam shell UNIX seperti bash atau zsh . Ini beroperasi dengan mendefinisikan fungsi yang disebut ':', yang menyebut dirinya dua kali, sekali di latar depan dan sekali di latar belakang.
Namun bit terakhir tidak sepenuhnya jelas bagi saya. Saya melihat definisi fungsi:
:(){ ... }
Tapi apa lagi yang terjadi? Juga melakukan kerang lainnya seperti ksh
, csh
, dan tcsh
juga mengalami nasib yang sama untuk dapat membangun sesuatu yang mirip?
sumber
Jawaban:
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 denganTerminated
(danjournalctl
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 menyatakanKilled 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 - katakanb()
saja tampaknya memiliki hasil yang diinginkan.sumber
Ctrl+Shift+u+<hex>
mana hex adalah kode hex dari karakter unicode yang ingin Anda tampilkan. Daftar unicode yang dapat dilihat dapat ditemukan di: fileformat.info/info/unicode/utf8test.htm (sebagian besar yang aneh ada di bagian "lain-lain"). Windows harus checkout superuser.com/questions/47420/… , dan saya pribadi menggunakan alat yang disebutkan dalam tautanunicodeinput.exe
atau memotong dan menempelkan melalui browser saya. Anda selalu dapat menggunakan urutan html seperti yang disarankan oleh sambler.