- PERINGATAN JANGAN MENCOBA MENJALANKAN INI PADA MESIN PRODUKSI
Dalam membaca halaman Wikipedia tentang topik tersebut, saya biasanya mengikuti apa yang terjadi dengan kode berikut:
:(){ :|:& };:
kutipan deskripsi
Bom garpu berikut disajikan sebagai 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
UNIX shell seperti bash atau zsh. Ini beroperasi dengan mendefinisikan
fungsi yang disebut ':', yang memanggil dirinya sendiri 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 lakukan shell lain seperti ksh
, csh
, dan tcsh
juga mengalami nasib yang sama karena mampu membangun sesuatu yang serupa?
Jawaban yang Diterima:
Bom garpu ini selalu mengingatkan saya pada sesuatu yang dikatakan 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 penggunaan pemipaan fungsi ke dirinya sendiri DAN membuat latar belakangnya.
Saya telah melihat ini dijawab di StackOverflow, dan saya pikir contoh yang diberikan di sana menggambarkannya dengan baik, hanya karena lebih mudah untuk melihat apa yang dilakukannya secara sekilas (dicuri dari tautan di atas…)
☃(){ ☃|☃& };☃
Tentukan fungsi bug ☃() { ... }
, tubuh yang memanggil dirinya sendiri (fungsi bug), menyalurkan output ke dirinya sendiri (fungsi bug) ☃|☃
, dan latar belakang hasil &
. Kemudian, setelah fungsi didefinisikan, panggil fungsi bug, ; ☃
.
Saya perhatikan bahwa setidaknya pada Arch VM saya, kebutuhan untuk melakukan proses background bukanlah persyaratan untuk memiliki hasil akhir yang sama, untuk menggunakan semua ruang proses yang tersedia dan membuat host rusak. Sebenarnya sekarang saya telah mengatakan bahwa tampaknya terkadang menghentikan proses pelarian dan setelah layar penuh -bash: fork: Resource temporarily unavailable
itu akan berhenti dengan Terminated
(dan journalctl
menunjukkan pembuangan inti bash).
Untuk menjawab pertanyaan Anda tentang csh/tcsh, tak satu pun dari shell tersebut mendukung fungsi, Anda hanya bisa alias. Jadi untuk shell tersebut Anda harus menulis skrip shell yang memanggil dirinya sendiri secara rekursif.
zsh tampaknya mengalami nasib yang sama (dengan kode yang sama), tidak membuang inti dan menyebabkan Arch memberikan Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, tapi masih terus bercabang. Setelah beberapa saat kemudian menyatakan Killed process 162 (systemd-logind) ...
(dan masih terus memiliki forking zsh).
Arch sepertinya tidak memiliki pacman
versi ksh, jadi saya harus mencobanya di debian. ksh objek ke :
sebagai nama fungsi, tetapi menggunakan sesuatu – katakan b()
malah tampaknya memiliki hasil yang diinginkan.