¿Cómo se llama dos veces la típica "bomba de tenedor"?

Después de pasar por las famosas preguntas Fork Bomb en Askubuntu y muchos otros sitios de Stack Exchange, no entiendo muy bien lo que todos dicen como si fuera obvio.

Muchas respuestas ( mejor ejemplo ) dicen esto:

" {:|: &} significa ejecutar la function : y enviar su salida a la function : otra vez"

Bueno, ¿cuál es exactamente la salida de:? ¿Qué se está pasando al otro?

Y también:

Básicamente, estás creando una function que se llama a sí misma dos veces en cada llamada y no tiene forma de terminar por sí misma.

¿Cómo exactamente eso se ejecuta dos veces ? En mi opinión, nada pasa al segundo : hasta el primero : termina su ejecución, que en realidad nunca terminará.

En C por ejemplo,

 foo() { foo(); foo(); // never executed } 

el segundo foo() no se ejecuta en absoluto, solo porque el primer foo() nunca termina.

Estoy pensando que la misma lógica se aplica a :(){ :|: & };: y

 :(){ : & };: 

hace el mismo trabajo que

 :(){ :|: & };: 

Por favor, ayúdame a entender la lógica.

La tubería no requiere que la primera instancia termine antes de que la otra inicie. En realidad, todo lo que realmente está haciendo es networkingirigir el stdout de la primera instancia al stdin de la segunda, para que puedan ejecutarse simultáneamente (como lo tienen que hacer para que funcione la bifurcación).

Bueno, ¿cuál es exactamente el resultado de:? lo que se está pasando al otro:?

':' no está escribiendo nada al otro ':' instancia, solo está networkingirigiendo el stdout al stdin de la segunda instancia. Si escribe algo durante su ejecución (que nunca lo hará, ya que no hace más que bifurcarse) iría al stdin de la otra instancia.

Ayuda a imaginar stdin y stdout como una stack:

Todo lo que está escrito en el stdin se astackrá listo para cuando el progtwig decida leer de él, mientras que el stdout funciona de la misma manera: un montón al que puede escribir, para que otros progtwigs puedan leer de él cuando lo deseen.

De esta forma, es fácil imaginar situaciones como una tubería que no tiene comunicación (dos stacks vacías) o escrituras y lecturas no sincronizadas.

¿Cómo exactamente eso se ejecuta dos veces? En mi opinión, nada pasa al segundo : hasta el primero : termina su ejecución, que en realidad nunca terminará.

Como solo estamos networkingirigiendo la input y la salida de las instancias, no es necesario que la primera instancia finalice antes de que comience la segunda. En realidad, generalmente se desea que ambos se ejecuten simultáneamente, de modo que el segundo pueda funcionar con los datos que analiza el primero sobre la marcha. Eso es lo que sucede aquí, ambos serán llamados sin necesidad de esperar a que los primeros terminen. Eso se aplica a todas las cadenas de tuberías, líneas de commands.

Estoy pensando que la misma lógica se aplica a: () {: |: &} ;: y

 :(){ : & };: 

Hace el mismo trabajo que

 :(){ :|: & };: 

El primero también funcionaría, aunque sería más lento. El segundo boostía exponencialmente, consumiendo los resources de la computadora más rápido:

Primera línea:: :(){ : & };:

1 instancia (+1) -> 2 instancias (+1) -> 3 instancias (+1) -> 4 instancias (+1) -> …

Segunda línea:: :(){ :|: &};:

1 instancia (+2) -> 3 instancias (+4) -> 7 instancias (+8) -> 15 instancias (+16) -> …