Codice più breve per I / O su disco infinito


49

(Basta aprire 50 schede in Google Chrome: D (sto scherzando, no non puoi))

Codice più breve per I / O su disco infinito qualsiasi lingua, esempio C #:

using System.IO;

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

Tuttavia, non è possibile riempire l'intero disco, poiché alla fine si arresterebbe e sarebbe finito.

E non puoi fare solo la lettura, deve accadere una scrittura infinita. (Deve uccidere il mio SSD dopo abbastanza tempo di esecuzione.)

Fai crack! :)


6
La lettura dei file invece di scriverli conta anche come I / O del disco? Che ne dici di scrivere a /dev/null? (È yes>/dev/nullvalida una risposta di Bash?)
Maniglia della porta

2
Può richiedere qualche input?
Utente112638726

29
Dang amico ... cosa ti ha fatto il tuo SSD?
R. Kap

2
Dato che non posso sperare di competere con soluzioni a 6 byte, la creazione del file ./a con i contenuti a 3 byte ./a conterebbe un premio bonus per il pensiero laterale? AFAIK semplicemente eseguendo un file fa sì che la scrittura di alcuni file system avvenga su molti sistemi, perché almeno il "tempo dell'ultimo accesso" viene aggiornato come sottoprodotto ;-)
Stilez

3
Molte di queste risposte scriveranno continuamente i dati nello stesso spazio. Ciò non si traduce in una scrittura effettiva del disco anche se i dati differiscono. (Caso estremo, dos -> comunicazioni di Windows. Ho scritto 4k di dati in DOS e li
ho riletti

Risposte:


26

DOS / batch: 4 byte

%0>x

Questo file batch chiamerà se stesso ( %0) e reindirizzerà ( >) l'output su un file chiamato x. Poiché l'eco è attivo per impostazione predefinita, questo genererà il percorso e il comando.


Alla fine questo esaurirà lo spazio su disco o l'output viene sovrascritto?
MathuSum Mut,

1
@MathuSumMut: con >esso verrà sovrascritto. >>aggiungerebbe
Thomas Weller l'

1
Si vince quindi credo: P
MathuSum Mut

2
@ ΈρικΚωνσταντόπουλος: è vero. In tal caso, viene prodotto un file con 0 byte, che non genera I / O come previsto da questa sfida. Ma non è nostro compito considerare ogni caso, altrimenti potresti voler disattivare la memorizzazione nella cache, i programmi antivirus, ...
Thomas Weller

1
La scrittura di un file a 0 byte causerà comunque l'I / O del disco, poiché deve aggiornare l'ora dell'ultima modifica all'interno della directory.

48

PowerShell v2 +, 10 byte

for(){1>1}

Ripete semplicemente all'infinito con un foranello vuoto . Ad ogni iterazione, generiamo l'intero 1(convertito implicitamente in una stringa) con l' > operatore di reindirizzamento , che sovrascrive il file indicato 1nella directory locale.


Potresti sostituire il secondo 1 con qualcos'altro (che rende un nome file valido) o deve essere 1?
Nic Hartley,

1
Sulla mia macchina virtuale Windows, Winload.exeè sufficiente ...
Comintern

Penso che debba essere un numero perché se si tratta di una lettera, verrebbe trattata come una variabile, per trattarla come sono richieste le virgolette di una stringa e sprecano byte. : P
MathuSum Mut

1
@QPaysTaxes MathuSum lo ha corretto. Il secondo 1deve essere un numero di qualche tipo affinché l'analisi implicita funzioni correttamente. Qualsiasi cosa [0-9]funzionerebbe allo stesso modo.
AdmBorkBork

1
@Nacht Forse è una stranezza del mio ambiente particolare, quindi. Nel mio ISE (PSv4 Win8.1), la sostituzione del secondo 1con qualcosa di non numerico (e non specificato come .\ao a.txto simile) provoca un errore di analisi.
AdmBorkBork,

28

Pyth, 6 byte

#.w]]0

L'unico comando di output dei file di Pyth è .w. Quando viene chiamato su una stringa, scrive quella stringa su un file in modalità append, il che non è utile ai fini di questa domanda. Quando viene chiamato su un array 2-d, scrive l'immagine corrispondente su quel file, sovrascrivendo il contenuto del file. Questo è ciò che fa questo programma. Il nome di output del file predefinito è o.png, quindi questo programma sovrascrive all'infinito il file o.pngcon un'immagine bianca da 1 pixel. #è un ciclo infinito.


27

Se vuoi una risposta più breve (ma più noiosa della mia altra):

Bash, 5 byte

>w;$0

Potrei accorciarlo se c'è un comando (lungo meno di 3 byte) che scrive qualcosa sull'I / O del disco. Qualcosa del genere syncfunzionerebbe, ma syncè di 4 byte 😛

Nota: questo non funziona se eseguito direttamente da bash, solo quando inserito in uno script ed eseguito come nome dello script. (ie echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)


1
Sembra che sia un pareggio tra me e @isaacg - chi vince?
Daniel,

8
Preferisco usare exec(o . $0). Penso che questo finirà i PID.
muru,

1
Il primo è wnecessario qui? Per me >wcrea semplicemente un file vuoto w, e farlo in un ciclo creerà I / O infinito perché i metadati mtime devono essere aggiornati continuamente.
Henning Makholm,

1
Se questo si qualifica @HenningMakholm, lo inserirò.
Daniel

2
Lo script contiene solo questi byte. Dal momento che è bash non c'è bisogno di compilatore o altro.
Daniel,

16

Rubino, 22 20 byte

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

Tronca e scrive ripetutamente 1a nel file a.

Grazie a Ventero per 2 byte!


3
open(?a,?w)<<1per salvare 2 byte.
Ventero,

Grazie, maniglia della porta, per averci onorato della tua presenza. Sono umiliato.
MathuSum Mut

Quello perde i descrittori di file? O viene chiuso quando esce dal campo di applicazione? (IDK Ruby, scusa).
Peter Cordes,

13

cmd, 14 byte

:a
cd>1
goto a

Sovrascrive all'infinito il file 1con la stringa nella directory corrente


Sono nuovo qui: le nuove righe di Windows ( CR LF) sono conteggiate come due byte?


13
Benvenuti in PPCG! Windows, almeno i sistemi moderni, dovrebbero essere in grado di gestire LFsenza problemi. Quanto sopra funziona per me solo LFcon Windows 8.1, quindi i tuoi 14 byte sono corretti.
AdmBorkBork

CR LF2 CR1 LF1
Erik the Outgolfer,

13

Bash + coreutils, 10

yes \>b|sh

Scrive un flusso continuo di >b, che viene reindirizzato shper la valutazione. >btronca semplicemente un file chiamato ba zero byte ogni volta.


4
+1 perché il tuo nome è davvero appropriato a ciò che farà questo frammento di codice
Olivier Dulac

Perché be no c?
Calcolatrice

9

Perl 5, 27 32 22 byte

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

Se è sufficiente cambiare il timestamp di modifica di un file ...

Spiegazione veloce:

{ # 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.
}

Soluzione precedente (32 byte): {{open my$h,'>o';print$h 1}redo}

Modifica: {open F,'O';print F 1;redo} ← Non ho testato il codice prima della pubblicazione; ora dovevo correggerlo.


1
: oa una variabile perl non preceduta da $!
gatto

@cat: non è una variabile normale, come uno scalare, un array o un hash. È semplicemente una parola nuda. A seconda del contesto, un bareword può essere considerato come un sub (una funzione), un glob, credo, o un filehandle. (Forse anche altri?)
g4v3

8

PHP, 60 30 17 16 15 byte

Aggiornato di nuovo come suggerito da @manatwork:

while(!`cd>1`);

Anche ora testato.


Un po 'di barare 22 byte:

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

Suggerimento precedente di @manatwork 30 byte:

mentre (file_put_contents (1,1));

NON TESTATO (nessun php disponibile su questo computer) 43 byte:

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

Un originale da golf da 45 byte:

$ A = fopen (1, 'w'); while (fputs ($ a, 1)) rewind ($ a);

Il mio primo post qui, unito perché ho appena dovuto provare questo: fino a quando la scrittura del file ha esito positivo, riavvolgere il puntatore del file per iniziare.


Semplicemente non può essere più piccolo di file_put_contents ().


5
while(file_put_contents(1,1));dovrebbe essere abbastanza. Si noti che l'esecuzione di script completi dalla riga di comando php -r '…'è accettabile secondo il consenso su meta Esecuzione di PHP con -rtag invece di codice .
arte

Questo sta effettivamente scrivendo su disco o solo un buffer in memoria?
Brice M. Dempsey,

1
@manatwork Oh amico! Sapevo che c'è sempre spazio per miglioramenti, ma troppo ... peccato che la funzione non abbia un nome più breve. : DI non so del buffer .. Mi chiedo se dovrei aggiornare la risposta con quella soluzione più breve.
Diynevala,

2
Se è più corto, ti preghiamo di aggiornare la tua risposta, vai avanti! :)
MathuSum Mut

È consentito chiamare exec () da php? Mi rendo conto che non è più nel "campo di applicazione" di php.
Diynevala,

7

sh, 11 byte

w>w;exec $0

Salvalo in un file senza caratteri speciali, come loop.sh, rendilo eseguibile ed eseguilo con ./loop.sho simile.

Questo scrive l'output del comando wnel file w, sovrascrivendo ogni volta il valore precedente. Quindi, si sostituisce con una nuova versione dello stesso programma, quindi può funzionare all'infinito.


questo manca un secondo >. inoltre, supponendo che tu abbia un $PATHumask / filesystem "speciale" e "speciale", puoi andare w>>w;$0, portandolo a 7 caratteri
mnagel

@mnagel >>è append, alla fine riempirà il disco
cat

1
@mnagel ma hai ragione a non aver bisogno di exec, non me ne sono reso conto. Qualcun altro l'ha fatto, quindi non aggiornerò, però
isaacg

3
O . $0invece di exec $0, forse? Non so se ciò verrà eseguito causando un overflow dello stack o qualcosa del genere, però. ... Sì, segfault.
muru,

7

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

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

Ancora una volta, sudo watch -n1 lsof -p `pidof inf`sembra dire che questo è valido.

COME NON HO VEDUTO QUELLO SPAZIO D: <

Grazie @Jens per la rasatura di 13 byte: D


1
La w+modalità viene letta e scritta, inizialmente troncando il file. Poiché non è necessario leggere, è possibile radere via un byte con just w, che tronca anche il file, ma non apre il file in modalità lettura.
Mego

1
Non è necessario return 0;se il ciclo non termina mai.
Jens,

1
Perché non usare al fputc(1,f)posto del super-prolisso fprintf(f," ")?
Jens,

1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}dal momento che un vuoto condizionale in formezzo true. 76 byte.
Jens,

1
@PeterCordes PPCG non è Stack Overflow; per favore non apportare modifiche alle risposte degli altri che cambiano codice o altre parti importanti della risposta. Le correzioni di errori di battitura vanno bene, ma nei commenti dovrebbe essere suggerito tutto ciò che (comprese le correzioni di affermazioni erroneamente fattuali).
gatto

6

Bash, 26 byte

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

Se dovessi espandere questo one-liner, otterrei questo:

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

Questo non può competere esattamente con la linea PowerShell a 10 byte, ma si terrà contro gli altri. Vedi la mia altra risposta per la versione a 6 byte.


2
while :;ls>l;done
Utente112638726

1
Il buon vecchio exectrucco farà meglio: ls>l;exec $0. Più breve, ma noioso.
arte

:>l;exec $0- la creazione del file sta scrivendo l'inode
user24582

7
Anche se elimini y, yescontinuerà comunque a scrivere nello stesso handle di file che aveva. Corri lsof | grep yese dovresti vedere qualcosa del genere /path/to/y (deleted). Questo riempirà il disco e fallirà.
muru,

4
Invece di rm yte puoi usare >yquale troncerà il file esistente. È anche un po 'più corto.
Aragaer,

6

TI-BASIC, 12 byte

While 1
Archive A
UnArchive A
End

Soluzione alternativa dall'utente lirtosiast con le stesse dimensioni:

While 1
SetUpEditor
Archive ∟1
End

Questo funzionerà sulla serie di calcolatori TI-83 + e TI-84 +.

Sì, questo funziona anche se A è già archiviato o non è inizializzato affatto all'inizio del programma! Il programma ha solo 12 byte a causa della tokenizzazione .


Non so se la memoria flash utilizzata dai calcolatori sia considerata "disco".
lirtosiast,

1
@lirtosiast A difesa di Jamy, gli SSD sono fatti di memoria flash =)
Cort Ammon

In ogni caso, il conteggio dei byte è di almeno 10 byte in meno. La seconda schermata Mem conta un'intestazione pari a 9 byte + la lunghezza del nome del programma, ma non lo facciamo qui per poterlo sottrarre.
lirtosiast

@lirtosiast Scrive e legge ripetutamente sulla ROM (memoria permanente) della calcolatrice, non sulla RAM. Naturalmente, i calcolatori non hanno un vero disco rigido all'interno :)
Jamy Mahabier,

@lirtosiast Grazie, non lo sapevo! (Mi chiedevo perché la quantità di byte segnalati dalla mia TI-84 + non corrispondesse al mio conteggio delle mani ...) Ho aggiornato la mia risposta.
Jamy Mahabier,

6

CPython 3.5, 33 16 byte

while 1:open("a")

Sì davvero. : D


while 1:open("a","w")è più breve e stracemostra che python sta eseguendo operazioni di I / O aperte, fstat64 e chiuse. Se il file aesiste già, può essere anche più breve: while 1:open('a')ciò genera ancora un open, fstat64e close, e modifica anche atimeil file.
Radovan Garabík,

@ RadovanGarabík: 0 Grazie, non sapevo che utile informazione! Certo, è specifico per l'implementazione.
gatto

5

MATL , 10 byte

`1[]T3$Z#T

Spiegazione

Questo è un ciclo infinito che scrive il numero 1 in un file chiamato inoutnella directory corrente, sovrascrivendo il contenuto del file precedente.

`       % 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

5

Haskell, 20 byte

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

Scrivi la stringa "a"in un file chiamato "b"e ripeti. writeFilesovrascrive il file se esiste.


4

JavaScript (Node.js), 43 41 byte

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

Scrive nullsu un file denominato a, quindi ripeti.


1
Che dire di scrivere co xnel file? Salva 2 byte. Inoltre, non require`fs`funziona?
Charlie,

1
@Charlie Un buon punto con la scrittura co x. require`fs`purtroppo non funziona, perché l'uso di backtick per chiamare una funzione la chiama con i primi argomenti come ["fs"](array, il cui primo e unico elemento è la stringa passata) anziché "fs"(solo la stringa). Prova console.log`test`ad esempio.
Michał Perłakowski

4

ZSH, 14 byte

for ((;;)) :>:

Zsh, a differenza di Bash e di altre conchiglie simili a Bourne, consente i loop senza la do ... donerecinzione , a condizione che la condizione sia opportunamente delimitata.

In alternativa, con while:

while {} {:>:}

Si noti che :è incorporato. Non puoi sospendere questo ciclo.

Il principio è lo stesso della risposta di Digital Trauma : nulla è scritto nel file, l'IO è semplicemente creato e troncato il file.


Devo dire che non avrei mai pensato di vedere Muru, il Muru, venire a giocare a Code Golf. Benvenuti in PPCG: D
cat

1
@cat Grazie. : DI ha già giocato una volta.
muru,

3

Ruggine, 84 byte

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

File::create tronca un file esistente, garantendo in tal modo che non rimaniamo a corto di spazio su disco.

Il compilatore usato (1.9 Nightly) emette un avviso sul risultato non utilizzato di write(...)ma compila comunque.


3

C, 92 byte

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

Sembra che tu possa risparmiare 1 byte di

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

il problema con quel ciclo è che + non ti dà l'ordine garantito.

O ricorsivo - non dovrebbe traboccare se il compilatore implementa correttamente la ricorsione della coda (f è in un ambito interno esplicito)

85 byte

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

Speriamo che la versione a 85 byte non esploda. : P
MathuSum Mut

2
@MathuSumMut: soluzione semplice: richiede la compilazione con ottimizzazioni. La ricorsione della chiamata di coda salva la giornata.
Giosuè,

1
C'è un sacco di spazio per il salvataggio di byte qui. Vedi la mia risposta per imballare cose all'interno di for(;;), e per funzioni più brevi di fprintf. Se fosse necessario includere stdio.h (cosa che non si fa), non è necessario uno spazio:#include<stdio.h>
Peter Cordes,

3

Mathematica, 14 byte

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

Scrive ripetutamente la stringa "a"in un file denominato anella directory corrente, creandola se non esiste.


scriverebbe la stringa "a" o il contenuto della variabile a? E se quest'ultimo, cosa farebbe se quella variabile non fosse ancora definita?
Michael Stern,

@MichaelStern Scrive la variabile a, che è indefinita, quindi scrive a\n.
LegionMammal978,

3

C, 40 byte

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

Tuttavia esaurirà rapidamente i descrittori di file; questo può essere superato con:

45 , 43 byte

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

Perché f non ha un tipo nel secondo?
gatto

2
@cat In C (molto stile K&R) è il valore predefinito int.
Edmz,

1
gcc e clang non compileranno la seconda versione. Anche GNU C non consente l'inizializzazione dinamica di una variabile statica / globale (una chiamata a open()non è una costante di compilazione). Inoltre, rimarrà a corto di spazio su disco, perché non è necessario cercare. Forse prova utime("a","")nel ciclo, che continuerà ad aggiornare il ctime. (Devi ancora opencreare un file con nome noto).
Peter Cordes,

@PeterCordes Hai ragione, grazie per averci fatto notare. Fisso.
Edmz,

Non soddisfa ancora il requisito del PO di non riempire il disco alla fine, ma forse vale comunque la pena conservarlo come risposta. (A meno che tu non abbia un'idea migliore della chiusura / riapertura della mia risposta (O_TRUNC) in un ciclo.) Contrariamente al mio commento precedente, l'aggiornamento dei timestamp di solito non produce realmente l'I / O del disco reale su Linux. Come forse uno scrivere ogni 24 ore con lazytime, come ho detto nella mia risposta.
Peter Cordes,

3

C su Linux amd64, 36 byte (solo timestamp), 52 49 byte (attività del disco reale)

open(2)Codifico le bandiere, quindi non è portabile ad altre ABI. Linux su altre piattaforme probabilmente usa lo stesso O_TRUNC, ecc., Ma altri sistemi operativi POSIX potrebbero non farlo.

+4 byte per passare una corretta autorizzazione arg per assicurarsi che il file sia creato con accesso in scrittura proprietario, vedi sotto. (Questo succede con gcc 5.2)

ANSI C un po 'portatile, 38/51 byte (solo timestamp), 52/67 byte (attività del disco reale)

Basato sulla risposta di @ Cat, con un suggerimento di @Jens.

Il primo numero è per le implementazioni in cui è intpossibile contenere FILE *fopen()il valore restituito, il secondo numero se non è possibile farlo. Su Linux, gli indirizzi heap si trovano nei 32 bit di spazio degli indirizzi bassi, quindi funziona anche senza -m32o -mx32. (La dichiarazione void*fopen();è più breve di #include <stdio.h>)


Solo I / O metadati data / ora :

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"));}

Scrivere un byte, colpire effettivamente il disco su Linux 4.2.0 + XFS + lazytime:

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

writeè la condizione for-loop, che va bene poiché restituisce sempre 1. closeè l'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

Spiegazione della versione non portatile:

Il file viene creato con autorizzazioni di Garbage Casuali. Con gcc5.2, con -O0o -O3, sembra includere l'autorizzazione di scrittura del proprietario, ma questo non è garantito. 0666è 438 decimale. Un terzo argomento per openrichiedere altri 4 byte . Stiamo già codificando O_TRUNC e così via, ma questo potrebbe interrompersi con un compilatore o libc diverso sulla stessa ABI.

Non possiamo omettere il secondo argomento open, perché il valore di garbage include O_EXCLe O_TRUNC|O_APPENDquindi open non riesce EINVAL.


Non è necessario salvare il valore restituito da open(). Supponiamo che lo sia 3, perché lo sarà sempre. Anche se iniziamo con fd 3 aperto, verrà chiuso dopo la prima iterazione. Nel peggiore dei casi, opencontinua ad aprire nuovi fds fino a quando 3 non è l'ultimo descrittore di file disponibile. Quindi, fino alle prime 65531 write()chiamate potrebbero non riuscire EBADF, ma funzionerà normalmente con ogni opencreazione fd = 3.

577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCsu Linux x86-64. Senza O_TRUNC, il tempo di mod dell'inode e il tempo di cambio non vengono aggiornati, quindi un arg più breve non è possibile. O_TRUNCè ancora essenziale per la versione che chiama writeper produrre l'attività del disco effettiva, non riscriverla in atto.

Vedo alcune risposte che open("a",1). O_CREAT è richiesto se anon esiste già. O_CREATè definito come ottale 0100 (64, 0x40) su Linux.


Nessuna perdita di risorse, quindi può funzionare per sempre. straceproduzione:

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

Ho ottenuto il valore decimale dei openflag per questo ABI utilizzando strace -eraw=opensulla mia versione C ++.

Su un filesystem con l' lazytimeopzione di mount Linux abilitata, una modifica che riguarda solo i timestamp dell'inode causerà una sola scrittura ogni 24 ore. Con quell'opzione mount disabilitata, l'aggiornamento del timestamp potrebbe essere un modo fattibile per consumare il tuo SSD. (Tuttavia, molte altre risposte eseguono solo I / O sui metadati).


alternative:

breve non funzionante :

main(){for(;;)close(write(open("a",577),"",3));}usa writeil valore restituito per passare un 3arg alla chiusura. Salva un altro byte, ma non funziona con gcc -O0 o -O3 su amd64. La spazzatura nel 3 ° argomento openè diversa e non include l'autorizzazione in scrittura. aviene creato la prima volta, ma tutte le iterazioni future falliscono -EACCESS.

più a lungo, funzionante, con diverse chiamate di sistema :

main(c){for(open("a",65);pwrite(3,"",1);)sync();} riscrive un byte sul posto e chiama sync()per sincronizzare tutti i filesystem a livello di sistema. Ciò mantiene accesa la luce dell'unità.

Non ci interessa quale byte, quindi non passiamo il 4o argomento a pwrite. Sì per i file sparsi:

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

Scrivere un byte con un offset di ~ 128TiB ha portato a xfs usando 300 kB di spazio per contenere la mappa dell'estensione, immagino. Non provarlo su OS X con HFS +: IIRC, HFS + non supporta file sparsi, quindi riempirà il disco.

XFS è un vero filesystem a 64 bit, che supporta singoli file fino a 8 exabyte . cioè 2 ^ 63-1, il valore massimo off_tpuò contenere.

strace produzione:

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

2

Racchetta, 46 byte

(do()(#f)(write-to-file'a"f"#:exists'replace))

1
Stavo pensando di rispondere in Racket, ma mi hai battuto. : P
cat

Per curiosità, hai trovato una risposta più breve?
Winny

1

Fattore, 73 byte

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

Imposta per sempre il contenuto del file sul byte nul.


1

CBM BASIC 7.0, 9 byte

0dS"a":rU

Questo programma, quando eseguito, si salva ripetutamente su disco. Ecco una versione più leggibile che non utilizza le abbreviazioni delle parole chiave BASIC:

0 dsave "a" : run

1
Si esaurisce la cassetta? ;)
MathuSum Mut

1
@MathuSumMut che sarebbe0 SAVE "A" : RUN
ceilingcat il

1

Python, 32 byte

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

Nota che se eseguito su Python 3, questo produrrà un numero infinito di avvisi. Inoltre, probabilmente finirà per essere fds se eseguito in un'implementazione non di conteggio.


Proprio come una nota, esiste una risposta più breve senza la writee la "w"parte del comando open.
Rɪᴋᴇʀ

1

Dyalog APL 15.0, 17 byte (non concorrenti)

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

Chrome attualmente rende U + 2262 errato. La riga sopra dovrebbe apparire come (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.

Questo non è competitivo perché la versione 15 non è stata ancora rilasciata.

Applica la funzione fino (⊢⊣⊃⎕NPUT⊢)a 'A'1quando l'ingresso non viene modificato (ovvero mai):

⊢⊣⊃⎕NPUT⊢ è un treno di funzioni:

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

I ritorni più a destra 'A'1non modificati; questo (nome file, sovrascrivi-flag) sarà l'argomento giusto per `⎕NPUT '.

'⊃' restituisce il primo elemento di 'A'1( 'A'); questi sono i dati da scrivere.

Quindi ⎕NPUTviene eseguito e riporta il numero di byte scritti (2 o 3 a seconda del sistema operativo); questo diventa l'argomento giusto per il .

L'estrema sinistra ritorna di nuovo 'A'1non modificata; questo è l'argomento sinistro di .

ignora l'argomento destro e restituisce l'argomento sinistro ( 'A'1), questo diventa il nuovo valore alimentato .

Poiché il nuovo valore è identico a quello precedente, l'operazione continua (per sempre).



0

editor di testo vim, 10 byte

qa:w<enter>@aq@a

8 byte se non è possibile il comando di esecuzione @a

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.