Código más corto para E / S de disco infinito

49

(Solo abre 50 pestañas en Google Chrome: D (es broma, no, no puedes))

Código más corto para E / S de disco infinito en cualquier idioma, ejemplo de C #:

using System.IO;

namespace FileApp {
    static class Program {
        public static void Main() {
            do {
                File.WriteAllText("a", "a");
                File.Delete("a");
            } while (true);
        }
    }
}

Sin embargo, no puede simplemente llenar todo el disco, ya que al final se detendría y sería finito.

Y no puedes leer solo, tiene que suceder una escritura infinita. (Tiene que matar mi SSD después de suficiente tiempo de ejecución).

¡Manos a la obra! :)

MathuSum Mut
fuente
66
¿ Leer archivos en lugar de escribirlos también cuenta como E / S de disco? ¿Qué hay de escribir a /dev/null? (¿Es yes>/dev/nulluna respuesta Bash válida?)
Pomo de la puerta
2
¿Puede tomar alguna entrada?
Usuario112638726
29
Dang man ... ¿qué te hizo tu SSD?
R. Kap
2
Como no puedo esperar competir con soluciones de 6 bytes, ¿crear el archivo ./a con los contenidos de 3 bytes ./a contaría para un premio extra por el pensamiento lateral? AFAIK simplemente ejecutando un archivo hace que se escriba algo en el sistema de archivos en muchos sistemas, porque al menos el 'último tiempo de acceso' se actualiza como un subproducto ;-)
Stilez
3
Muchas de estas respuestas escribirán los datos en el mismo espacio una y otra vez. Eso no da como resultado una escritura de disco real, incluso si los datos difieren. (Caso extremo, dos -> comunicaciones de Windows. Escribí 4k de datos en dos y los leí en Windows, siempre y cuando los datos fluyeran, la luz del disco permanecería apagada)
Loren Pechtel

Respuestas:

26

DOS / Lote: 4 bytes

%0>x

Este archivo por lotes se llamará a sí mismo ( %0) y redirigirá ( >) la salida a un archivo llamado x. Como echo está activado de forma predeterminada, esto generará la ruta y el comando.

Thomas Weller
fuente
¿Eventualmente se quedará sin espacio en disco o se sobrescribirá la salida?
MathuSum Mut
1
@MathuSumMut: con >esto se sobrescribirá. >>agregaría
Thomas Weller
1
Ganas
2
@ ΈρικΚωνσταντόπουλος: Eso es cierto. En ese caso, se genera un archivo con 0 bytes, que no genera E / S como se esperaba en este desafío. Pero no es nuestra tarea considerar todos los casos, de lo contrario es posible que desee desactivar el almacenamiento en caché, los escáneres de virus, ...
Thomas Weller
1
Escribir un archivo de 0 bytes seguirá causando E / S de disco, ya que tiene que actualizar la hora de la última modificación dentro del directorio.
48

PowerShell v2 +, 10 bytes

for(){1>1}

Simplemente realiza un bucle infinito con un forbucle vacío . En cada iteración, sacamos el entero 1(implícitamente convertido a una cadena) con el > operador de redireccionamiento , que sobrescribe el archivo nombrado 1en el directorio local.

AdmBorkBork
fuente
¿Podría reemplazar el segundo 1 con cualquier otra cosa (que haga un nombre de archivo válido) o tiene que ser 1?
Nic Hartley
1
En mi VM de Windows, Winload.exees suficiente ...
Comintern
Creo que tiene que ser un número porque si se trata de una letra, se trataría como una variable, para tratarla como una cadena se requieren comillas, y desperdician bytes. : P
MathuSum Mut
1
@QPaysTaxes MathuSum lo tiene correcto. El segundo 1debe ser una especie de algún tipo para que el análisis implícito funcione correctamente. Cualquier cosa de [0-9]funcionaría igual.
AdmBorkBork
1
@Nacht Quizás sea una peculiaridad de mi entorno particular, entonces. En mi ISE (PSv4 Win8.1), reemplazar el segundo 1con algo no numérico (y no especificado como .\ao a.txtsimilar) da como resultado un error de análisis.
AdmBorkBork
28

Pyth, 6 bytes

#.w]]0

El único comando de salida de archivo de Pyth es .w. Cuando se invoca en una cadena, escribe esa cadena en un archivo en modo anexar, lo que no es bueno para el propósito de esta pregunta. Cuando se llama en una matriz de 2-d, escribe la imagen correspondiente en ese archivo, sobrescribiendo el contenido del archivo. Eso es lo que hace este programa. El nombre de salida del archivo predeterminado es o.png, por lo que este programa sobrescribe infinitamente el archivo o.pngcon una imagen blanca de 1 píxel. #Es un bucle infinito.

isaacg
fuente
27

Si quieres una respuesta más corta (pero más aburrida que la otra):

Bash, 5 bytes

>w;$0

Podría hacerlo más corto si hay un comando (menos de 3 bytes de longitud) que escribe algo en la E / S del disco. Algo así syncfuncionaría, pero synces de 4 bytes 😛

Nota: esto no funciona cuando se ejecuta directamente desde bash, solo cuando se coloca un script y se ejecuta como el nombre del script. (es decir echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)

Daniel
fuente
1
Parece que es un empate entre @isaacg y yo, ¿quién gana?
Daniel
8
Prefiero usar exec(o . $0). Creo que esto se quedará sin PID.
muru
1
¿Se wnecesita el primero aquí? Para mí, simplemente >wcrea un archivo vacío w, y hacerlo en un bucle creará E / S infinitas porque los metadatos mtime deben actualizarse continuamente.
Henning Makholm
1
Si eso califica a @HenningMakholm, lo pondré.
Daniel
2
El script solo contiene estos bytes. Como es bash, no se necesita compilador ni nada sofisticado.
Daniel
16

Ruby, 22 20 bytes

loop{open(?a,?w)<<1}

Se trunca y escribe repetidamente 1a en el archivo a.

¡Gracias a Ventero por 2 bytes!

Pomo de la puerta
fuente
3
open(?a,?w)<<1para guardar 2 bytes.
Ventero
Gracias, pomo de la puerta, por honrarnos con su presencia. Estoy humillado.
MathuSum Mut
¿Se filtran los descriptores de archivos? ¿O se cierra cuando sale del alcance? (IDK Ruby, lo siento).
Peter Cordes
13

cmd, 14 bytes

:a
cd>1
goto a

Sobrescribe infinitamente el archivo 1con la cadena en el directorio actual


Soy nuevo aquí: ¿Las nuevas líneas de Windows ( CR LF) se cuentan como dos bytes?

MrPaulch
fuente
13
Bienvenido a PPCG! Windows, al menos los sistemas modernos, deberían poder manejar LFsin problemas. Lo anterior funciona para mí solo LFcon Windows 8.1, por lo que sus 14 bytes son correctos.
AdmBorkBork 01 de
CR LF2 CR1 LF1
Erik the Outgolfer
13

Bash + coreutils, 10

yes \>b|sh

Escribe una secuencia continua de >b, que se canaliza shpara su evaluación. >bsimplemente trunca un archivo llamado ba cero bytes cada vez.

Trauma digital
fuente
44
+1 porque tu nombre es realmente apropiado para lo que hará este fragmento de código
Olivier Dulac
¿Por qué by no c?
CalculatorFeline
9

Perl 5, 27 32 22 bytes

{{open my$h,'>o'}redo}

Si basta con cambiar la marca de tiempo de modificación de un archivo ...

Explicación rápida:

{ # Braces implicitly create/mark a loop.
    { # They also create closures, for `my` variables.
        open my $filehandle, '>', 'o';    # Writing to file "o".
        # close $filehandle;   # Called implicitly when
                               # variable gets destroyed.
    } # $filehandle gets destroyed because there are no references to it.
    redo; # ...the loop.
}

Solución anterior (32 bytes): {{open my$h,'>o';print$h 1}redo}

Editar: {open F,'O';print F 1;redo} ← No probé el código antes de publicarlo; ahora tenía que corregirlo.

g4v3
fuente
1
: una variable perl no tiene el prefijo $!
gato
@cat: no es una variable regular, como un escalar, una matriz o un hash. Es simplemente una palabra al descubierto. Dependiendo del contexto, una palabra desnuda puede tomarse como un sub (una función), un glob, creo, o un identificador de archivo. (¿Quizás otros también?)
g4v3
8

PHP, 60 30 17 16 15 bytes

Actualizado una vez más según @manatwork sugirió:

while(!`cd>1`);

También ahora probado.


Un poco de trampa 22 bytes:

while (exec ('> 1 dir'));

Sugerencia anterior de @manatwork 30 bytes:

while (file_put_contents (1,1));

NO PROBADO (no hay php disponible en esta computadora) 43 bytes:

para ($ a = fopen (1, 'w'); fputs ($ a, 1); fclose ($ a))

Un original de golf de 45 bytes:

$ a = fopen (1, 'w'); mientras que (fputs ($ a, 1)) rebobina ($ a);

Mi primera publicación aquí, me uní porque solo tenía que probar esto: mientras la escritura del archivo tenga éxito, rebobina el puntero del archivo para comenzar.


Simplemente no puede ser más pequeño que el file_put_contents ().

diynevala
fuente
55
while(file_put_contents(1,1));debería ser suficiente. Tenga en cuenta que ejecutar scripts completos desde la línea de comandos php -r '…'es aceptable según el consenso en meta Ejecutar PHP con en -rlugar de etiquetas de código .
manatwork
¿Esto realmente está escribiendo en el disco o simplemente un búfer en la memoria?
Brice M. Dempsey
1
@manatwork ¡Oh hombre! Sabía que siempre hay margen de mejora, pero eso ... lástima que esa función no tenga un nombre más corto. : DI no sé sobre el búfer. Me pregunto si debería actualizar la respuesta con esa solución más corta.
diynevala
2
Si es más corto, actualice su respuesta, ¡adelante! :)
MathuSum Mut
¿Está permitido llamar a exec () desde php? Me doy cuenta de que ya no está en el "alcance" de php.
diynevala
7

sh, 11 bytes

w>w;exec $0

Guarde esto en un archivo sin caracteres especiales, como loop.sh, hágalo ejecutable y ejecútelo con ./loop.sho similar.

Esto escribe la salida del comando wen el archivo w, sobrescribiendo el valor anterior cada vez. Luego, se reemplaza con una nueva versión del mismo programa, por lo que puede ejecutarse infinitamente.

isaacg
fuente
esta falta un segundo >. también, suponiendo que tenga un $PATHsistema de archivos / umask "especial" y "especial", puede w>>w;$0buscarlo, reduciéndolo a 7 caracteres
mnagel
@mnagel >>se agrega , eventualmente llenará el disco
cat
1
@mnagel pero tienes razón sobre no necesitar ejecutivo, no me di cuenta de eso. Alguien más lo ha hecho, por lo que no se actualizan, aunque
isaacg
3
O en . $0lugar de exec $0, tal vez? Sin embargo, no sé si eso se ejecutará causando un desbordamiento de la pila o algo así. ... Sí, se rompió.
muru
7

C, 95 94 93 89 78 90 89 76 75 bytes

#include<stdio.h>
main(){for(FILE*f=fopen("a","w");;fputc(0,f),fclose(f));}   

Nuevamente, sudo watch -n1 lsof -p `pidof inf`parece decir que esto es válido.

¿CÓMO NO HE VISTO ESE ESPACIO D: <

Gracias @Jens por recortar 13 bytes: D

gato
fuente
1
El w+modo es lectura y escritura, inicialmente truncando el archivo. Como no necesita leer, puede eliminar un byte con solo w, que también trunca el archivo, pero no abre el archivo en modo de lectura.
Mego
1
No es necesario return 0;si el ciclo nunca termina.
Jens
1
¿Por qué no usar en fputc(1,f)lugar del super verboso fprintf(f," ")?
Jens
1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}desde un vacío condicional en formedios true. 76 bytes.
Jens
1
@PeterCordes PPCG no es desbordamiento de pila; no edite las respuestas de otros que cambien el código u otras partes importantes de la respuesta. Las correcciones de errores tipográficos están bien, pero cualquier cosa más allá de eso (incluidas las correcciones de declaraciones objetivamente incorrectas) debe sugerirse en los comentarios.
gato
6

Bash, 26 bytes

yes>y&while :;do rm y;done

Si tuviera que expandir esta línea, obtendría esto:

yes > y &      # Write out infinitely to the file y in the current directory
while true     # Let's do something forever
do             # Here's what we're going to do
    rm y       # delete y
done           # That's all we're going to do

Esto no puede competir exactamente con la línea PowerShell de 10 bytes, pero se mantendrá firme frente a los demás. Vea mi otra respuesta para la versión de 6 bytes.

Daniel
fuente
2
while :;ls>l;done
User112638726
1
El buen viejo exectruco hará mejor: ls>l;exec $0. Más corto pero aburrido.
manatwork
:>l;exec $0- la creación del archivo está escribiendo el inodo
user24582
77
Aunque elimine y, yesseguirá escribiendo en el mismo identificador de archivo que tenía. Corre lsof | grep yesy deberías ver algo así /path/to/y (deleted). Esto llenará el disco y fallará.
muru
44
En lugar de rm yusar, >ypuede truncar el archivo existente. También es un poco más corto.
aragaer
6

TI-BASIC, 12 bytes

While 1
Archive A
UnArchive A
End

Solución alternativa por usuario de lirtosiast con el mismo tamaño:

While 1
SetUpEditor
Archive ∟1
End

Esto funcionará en las series de calculadoras TI-83 + y TI-84 +.

¡Sí, esto también funciona si A ya está archivado o no está inicializado en absoluto al inicio del programa! El programa tiene solo 12 bytes debido a la tokenización .

Jamy Mahabier
fuente
No sé si la memoria flash utilizada por las calculadoras cuenta como "disco".
lirtosiast el
1
@lirtosiast En defensa de Jamy, los SSD están hechos de memoria flash =)
Cort Ammon
En cualquier caso, el recuento de bytes es al menos 10 bytes menos. La segunda pantalla de Mem cuenta un encabezado igual a 9 bytes + la longitud del nombre del programa, pero no lo hacemos aquí para que pueda restarlo.
lirtosiast el
@lirtosiast Esto escribe y lee repetidamente en la ROM (memoria permanente) de la calculadora, no en la RAM. Por supuesto, las calculadoras no tienen un disco duro real :)
Jamy Mahabier
@lirtosiast ¡Gracias, no lo sabía! (Me preguntaba por qué la cantidad de bytes que informó mi TI-84 + no coincidía con mi conteo manual ...) He actualizado mi respuesta.
Jamy Mahabier
6

CPython 3.5, 33 16 bytes

while 1:open("a")

Sí, en serio. :RE

gato
fuente
while 1:open("a","w")es más corto y stracemuestra que python está haciendo operaciones abiertas, fstat64 y cerradas, definitivamente operaciones de E / S. Si el archivo aya existe, puede ser aún más corto: lo while 1:open('a')que aún genera un open, fstat64y close, e incluso modifica atimeel archivo.
Radovan Garabík
@ RadovanGarabík: 0 ¡Gracias, no conocía esa información útil! Por supuesto, es una implementación específica.
gato
5

MATL , 10 bytes

`1[]T3$Z#T

Explicación

Este es un bucle infinito que escribe un número 1 en un archivo llamado inouten el directorio actual, sobrescribiendo el contenido del archivo anterior.

`       % do...while loop
  1     %   push number 1
  []    %   push empty array
  T     %   push "true"
  3$Z#  %   fwrite function. First input is file content. Second is file name;
        %   defaults to "inout" if empty. Third indicates that any previous
        %   file contents should be discarded
  T     %   push "true": loop condition 
        % implicitly end loop. Loop condition is "true", so the loop is infinite
Luis Mendo
fuente
5

Haskell, 20 bytes

f=writeFile"b""a">>f

Escriba la cadena "a"en un archivo llamado "b"y repita. writeFilesobrescribe el archivo si existe.

nimi
fuente
4

JavaScript (Node.js), 43 41 bytes

(c=x=>require("fs").writeFile("a",x,c))()

Escribe nullen un archivo llamado a, luego repite.

Michał Perłakowski
fuente
1
¿Qué pasa con la escritura co xal archivo? Guarda 2 bytes. Además, no require`fs`funciona?
Charlie
1
@ Charlie Buen punto con la escritura co x. require`fs`desafortunadamente no funciona, porque el uso de backticks para llamar a una función la llama con los primeros argumentos como ["fs"](matriz, cuyo primer y único elemento es la cadena pasada) en lugar de "fs"(solo la cadena). Prueba console.log`test`por ejemplo.
Michał Perłakowski el
4

ZSH, 14 bytes

for ((;;)) :>:

Zsh, a diferencia de Bash y otras conchas tipo Bourne, permite bucles sin la do ... donecerca , siempre que la condición esté delimitada adecuadamente.

Alternativamente, con while:

while {} {:>:}

Tenga en cuenta que :es un incorporado. No puedes suspender este bucle.

El principio es el mismo que en la respuesta de Digital Trauma : no se escribe nada en el archivo, el IO es puramente de crear y truncar el archivo.

muru
fuente
Debo decir que nunca pensé que vería a muru, el muru, ven a jugar a Code Golf. Bienvenido a PPCG: D
cat
1
@cat Gracias. : DI he jugado una vez antes.
muru
3

Óxido, 84 bytes

fn main(){loop{use std::io::Write;std::fs::File::create("a").unwrap().write(b"a");}}

File::create trunca un archivo existente, asegurando así que no nos quedemos sin espacio en disco.

El compilador utilizado (1.9 Nocturno) emite una advertencia sobre el resultado no utilizado write(...)pero, sin embargo, compila.

ECS
fuente
3

C, 92 bytes

#include <stdio.h>
main(){for(FILE*f=fopen("a","w+");fprintf(f," "),!fclose(f);;);return 0;}

Si bien parece que podría guardar 1 byte por

  for(FILE*f=fopen("a","w+");fprintf(f," ")+fclose(f);;){}

El problema con ese ciclo es que + no le da el pedido garantizado.

O recursivo: no debería desbordarse si el compilador implementa correctamente la recursión de cola (f está en un ámbito interno explícito)

85 bytes

#include <stdio.h>
main(){{FILE*f=fopen("a","w+");fprintf(f," ");fclose(f);}main();}
MSalters
fuente
Esperemos que la versión de 85 bytes no explote. : P
MathuSum Mut
2
@MathuSumMut: Solución fácil: requiere compilación con optimizaciones. La recursión de llamadas de cola salva el día.
Joshua
1
Hay muchas posibilidades para guardar bytes aquí. Vea mi respuesta para empaquetar cosas dentro de for(;;), y para funciones más cortas que fprintf. Si necesita incluir stdio.h (que no necesita), no necesita un espacio:#include<stdio.h>
Peter Cordes
3

Mathematica, 14 bytes

For[,1>0,a>>a]

Repetidamente escribe la cadena "a"en un archivo nombrado aen el directorio actual, creándolo si no existe.

LegionMammal978
fuente
¿escribiría la cadena "a" o el contenido de la variable a? Y si es lo último, ¿qué haría si esa variable aún no estuviera definida?
Michael Stern
@MichaelStern Escribe la variable a, que no está definida, por lo que solo escribe a\n.
LegionMammal978
3

C, 40 bytes

main(){for(;;)write(open("a",1)," ",1);}

Sin embargo, se quedará rápidamente sin descriptores de archivo; Esto se puede superar con:

45 , 43 bytes

main(f){for(f=open("a",1);;)write(f,"",1);}
edmz
fuente
¿Por qué f no tiene un tipo en el segundo?
gato
2
@cat En C (muy estilo K&R) está predeterminado int.
edmz
1
gcc y clang no compilarán la segunda versión. Incluso GNU C no permite la inicialización dinámica de una variable estática / global (una llamada a open()no es una constante de tiempo de compilación). Además, se quedará sin espacio en disco, porque no hay lseek. Tal vez intente utime("a","")en el bucle, que seguirá actualizando el ctime. (Aún opendebe crear un archivo de nombre conocido).
Peter Cordes
@PeterCordes Tienes razón, gracias por señalar. Fijo.
edmz
Todavía no satisface el requisito del OP de no llenar el disco eventualmente, pero tal vez valga la pena mantenerlo como respuesta. (A menos que tenga una idea mejor que cerrar / reabrir mi respuesta (O_TRUNC) en un bucle). Contrariamente a mi comentario anterior, la actualización de las marcas de tiempo generalmente no produce realmente E / S de disco real en Linux. Como tal vez una escritura cada 24 horas con lazytime, como dije en mi respuesta.
Peter Cordes
3

C en amd64 Linux, 36 bytes (solo marca de tiempo), 52 49 bytes (actividad de disco real)

Codifico las open(2)banderas, por lo que esto no es portátil para otras ABI. Linux en otras plataformas probablemente usa lo mismo O_TRUNC, etc., pero otros sistemas operativos POSIX pueden no hacerlo.

+4 bytes para pasar un argumento de permiso correcto para asegurarse de que el archivo se crea con acceso de escritura del propietario, vea a continuación. (Esto sucede para trabajar con gcc 5.2)

ANSI C algo portátil, 38/51 bytes (solo marca de tiempo), 52/67 bytes (actividad real del disco)

Basado en la respuesta de @ Cat, con un consejo de @Jens.

El primer número es para implementaciones donde un valor de retorno intpuede contener FILE *fopen(), el segundo número si no podemos hacer eso. En Linux, las direcciones de montón se encuentran en los bajos 32 bits de espacio de direcciones, por lo que funciona incluso sin -m32o -mx32. (La declaración void*fopen();es más corta que #include <stdio.h>)


Marca de tiempo de E / S de metadatos solamente :

main(){for(;;)close(open("a",577));}   // Linux x86-64

//void*fopen();       // compile with -m32 or -mx32 or whatever, so an int holds a pointer.
main(){for(;;)fclose(fopen("a","w"));}

Escribir un byte, en realidad golpear el disco en Linux 4.2.0 + XFS + lazytime:

main(){for(;write(open("a",577),"",1);close(3));}

writees la condición for-loop, que está bien ya que siempre devuelve 1. closees el incremento.

// semi-portable: storing a FILE* in an int.  Works on many systems
main(f){for(;f=fopen("a","w");fclose(f))fputc(0,f);}                 // 52 bytes

// Should be highly portable, except to systems that require prototypes for all functions.
void*f,*fopen();main(){for(;f=fopen("a","w");fclose(f))fputc(0,f);}   // 67 bytes

Explicación de la versión no portátil:

El archivo se crea con permisos de basura aleatorios. Con gcc5.2, con -O0o -O3, resulta que incluye permiso de escritura del propietario, pero esto no está garantizado. 0666es decimal 438. Un tercer argumento para opentomaría otros 4 bytes . Ya estamos codificando O_TRUNC, etc., pero esto podría romperse con un compilador o libc diferente en el mismo ABI.

No podemos omitir el segundo argumento open, porque el valor de la basura incluye O_EXCL, y O_TRUNC|O_APPEND, por lo tanto, open falla EINVAL.


No necesitamos guardar el valor de retorno de open(). Asumimos que es 3, porque siempre lo será. Incluso si comenzamos con fd 3 abierto, se cerrará después de la primera iteración. En el peor de los casos, opensigue abriendo nuevos fds hasta que 3 es el último descriptor de archivo disponible. Por lo tanto, hasta las primeras 65531 write()llamadas podrían fallar EBADF, pero luego funcionarán normalmente con cada opencreación de fd = 3.

577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCen Linux x86-64. Sin O_TRUNC, el tiempo de modificación del inodo y el tiempo de cambio no se actualizan, por lo que no es posible un argumento más corto. O_TRUNCsigue siendo esencial para la versión que llama writea producir actividad de disco real, no a reescribir en su lugar.

Veo algunas respuestas que open("a",1). O_CREAT es obligatorio si aaún no existe. O_CREATse define como octal 0100 (64, 0x40) en Linux.


No hay fugas de recursos, por lo que puede ejecutarse para siempre. stracesalida:

open("a", O_WRONLY|O_CREAT|O_TRUNC, 03777762713526650) = 3
close(3)                                = 0
... repeating

o

open("a", O_WRONLY|O_CREAT|O_TRUNC, 01) = 3
write(3, "\0", 1)                       = 1   # This is the terminating 0 byte in the empty string we pass to write(2)
close(3)                                = 0

Obtuve el valor decimal de las openbanderas para este ABI usando strace -eraw=openen mi versión C ++.

En un sistema de archivos con la lazytimeopción de montaje de Linux habilitada, un cambio que solo afecta a las marcas de tiempo del inodo solo causará una escritura cada 24 horas. Con esa opción de montaje desactivada, la actualización de la marca de tiempo podría ser una forma viable de desgastar su SSD. (Sin embargo, varias otras respuestas solo hacen E / S de metadatos).


alternativas:

más corto que no funciona :

main(){for(;;)close(write(open("a",577),"",3));}usa writeel valor de retorno para pasar un 3argumento para cerrar. Guarda otro byte, pero no funciona con gcc -O0 u -O3 en amd64. La basura en el 3er argumento openes diferente y no incluye permiso de escritura. ase crea la primera vez, pero todas las iteraciones futuras fallan -EACCESS.

más largo, trabajando, con diferentes llamadas al sistema :

main(c){for(open("a",65);pwrite(3,"",1);)sync();} reescribe un byte en el lugar y llama sync() para sincronizar todos los sistemas de archivos en todo el sistema. Esto mantiene la luz de la unidad encendida.

No nos importa qué byte, por lo que no pasamos el 4to argumento para escribir. Yay para archivos dispersos:

$ ll -s a
300K -rwx-wx--- 1 peter peter 128T May 15 11:43 a

Supongo que escribir un byte en un desplazamiento de ~ 128TiB condujo a xfs usando 300kB de espacio para contener el mapa de extensión. No intente esto en OS X con HFS +: IIRC, HFS + no admite archivos dispersos, por lo que llenará el disco.

XFS es un sistema de archivos de 64 bits adecuado, que admite archivos individuales de hasta 8 exabytes . es decir, 2 ^ 63-1, el valor máximo off_tpuede mantenerse.

strace salida:

open("a", O_WRONLY|O_CREAT, 03777711166007270) = 3
pwrite(3, "\0", 1, 139989929353760)     = 1
sync()                                  = 0
pwrite(3, "\0", 1, 139989929380071)     = 1
sync()                                  = 0
...
Peter Cordes
fuente
2

Raqueta, 46 bytes

(do()(#f)(write-to-file'a"f"#:exists'replace))
Winny
fuente
1
Estaba pensando en responder en Racket, pero me ganaste. : P
gato
Por curiosidad, ¿encontraste una respuesta más corta?
Winny
1

Factor, 73 bytes

USING: io.files io.encodings
[ 0 "a" utf8 set-file-contents ] [ t ] while

Establece el contenido del archivo en el byte nul para siempre.

gato
fuente
1

CBM BASIC 7.0, 9 bytes

0dS"a":rU

Este programa, cuando se ejecuta, se guarda repetidamente en el disco. Aquí hay una versión más legible que no usa abreviaturas de palabras clave BASIC:

0 dsave "a" : run
Psiconauta
fuente
1
¿Se queda sin cinta de cassette? ;)
MathuSum Mut
1
@MathuSumMut eso sería0 SAVE "A" : RUN
ceilingcat
1

Python, 32 bytes

while 1:open("a","w").write("b")

Tenga en cuenta que si se ejecuta en Python 3, esto producirá un número infinito de advertencias. Además, probablemente se quedará sin fds si se ejecuta en una implementación sin recuento.

pppery
fuente
Solo como una nota, existe una respuesta más corta sin el writey la "w"parte del comando abierto.
Rɪᴋᴇʀ
1

Dyalog APL 15.0, 17 bytes (no competidor)

(⊢⊣⊃⎕NPUT⊢)⍣≢'A'1

Chrome actualmente representa U + 2262 incorrecto. La línea de arriba debería verse así (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.

Esto no es competitivo porque la versión 15 aún no se ha lanzado.

Se aplica la función (⊢⊣⊃⎕NPUT⊢)en 'A'1hasta que la entrada se cambia (es decir, nunca):

⊢⊣⊃⎕NPUT⊢ es un tren funcional:

┌─┼───┐      
⊢ ⊣ ┌─┼─────┐
    ⊃ ⎕NPUT ⊢

El más a la derecha vuelve 'A'1sin modificar; Este (nombre de archivo, sobrescribir-bandera) será el argumento correcto para `⎕NPUT '.

'⊃' devuelve el primer elemento de 'A'1( 'A'); Esta es la información a escribir.

Luego ⎕NPUTse ejecuta e informa cuántos bytes se escribieron (2 o 3 dependiendo del sistema operativo); esto se convierte en el argumento correcto para el .

El extremo izquierdo vuelve nuevamente 'A'1sin modificaciones; Este es el argumento izquierdo de la .

ignora su argumento derecho y devuelve el argumento izquierdo ( 'A'1), este se convierte en el nuevo valor alimentado .

Como el nuevo valor es idéntico al anterior, la operación continúa (para siempre).

Adán
fuente
1

SmileBASIC, 12 bytes

SAVE"A
EXEC.
12Me21
fuente
Sin embargo, ¿no se queda sin cinta de cassette?
MathuSum Mut
0

editor de texto vim, 10 bytes

qa:w<enter>@aq@a

8 bytes si no puede el comando de ejecución @a

Radovan Garabík
fuente