Code le plus court pour les E / S disque infinies

49

(Il suffit d'ouvrir 50 onglets dans Google Chrome: D (je plaisante, non, vous ne pouvez pas))

Code le plus court pour les E / S disque infinies n’importe quel langage, exemple en C #:

using System.IO;

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

Cependant, vous ne pouvez pas simplement remplir le disque en entier, car cela s’arrêterait à la fin et serait fini.

Et vous ne pouvez pas lire uniquement, une écriture infinie doit se produire. (Il doit tuer mon SSD après suffisamment de temps d'exécution.)

Obtenez craquer! :)

MathuSum Mut
la source
6
La lecture de fichiers au lieu de les écrire est-elle également considérée comme une entrée / sortie de disque? Qu'en est-il d'écrire /dev/null? (Une yes>/dev/nullréponse Bash est -elle valide?)
Bouton de porte
2
Peut-il prendre n'importe quelle entrée?
User112638726
29
Dang man ... qu'est-ce que ton SSD t'a fait?
R. Kap
2
Comme je ne peux pas espérer rivaliser avec les solutions à 6 octets, créer le fichier ./a avec le contenu à 3 octets ./ compterait pour un prix supplémentaire pour la pensée latérale? Si je ne me trompe pas, l'exécution d'un fichier entraîne l' écriture de certains systèmes de fichiers sur de nombreux systèmes, car au moins le «dernier accès» est mis à jour en tant que sous-produit ;-)
Stilez le
3
Beaucoup de ces réponses vont écrire les données dans le même espace, encore et encore. Cela n'entraîne pas une écriture réelle sur le disque, même si les données diffèrent. (Cas extrême, dos -> communications Windows. J'ai écrit 4k de données dans dos et les relire dans Windows - tant que les données coulaient, la lumière du disque restait éteinte.)
Loren Pechtel

Réponses:

26

DOS / Lot: 4 octets

%0>x

Ce fichier de commandes s'appellera ( %0) et redirigera ( >) la sortie vers un fichier appelé x. Comme echo est activé par défaut, le chemin et la commande seront générés.

Thomas Weller
la source
Est-ce que cela va finir par manquer d'espace disque ou est-ce que la sortie est écrasée?
MathuSum Mut
1
@MathuSumMut: Avec >cela sera écrasé. >>serait annexer
Thomas Weller
1
Vous gagnez alors, je suppose: P
MathuSum Mut
2
@ ΡικΚωνσταντόπουλος: C'est vrai. Dans ce cas, un fichier avec 0 octet est généré, ne générant pas d'E / S comme prévu par ce défi. Mais ce n'est pas notre tâche d'examiner tous les cas, sinon vous pouvez désactiver le cache, les scanners de virus, ...
Thomas Weller
1
L'écriture d'un fichier de 0 octet provoquera toujours des E / S sur le disque, car il doit mettre à jour l'heure de la dernière modification dans le répertoire.
48

PowerShell v2 +, 10 octets

for(){1>1}

forBoucle simplement infiniment avec une boucle vide . À chaque itération, nous produisons l'entier 1(converti implicitement en chaîne) avec l' > opérateur de redirection , qui écrase le fichier nommé 1dans le répertoire local.

AdmBorkBork
la source
Pourriez-vous remplacer le second 1 par quelque chose d'autre (qui donne un nom de fichier valide) ou faut-il qu'il soit 1?
Nic Hartley
1
Sur ma machine virtuelle Windows, cela Winload.exesuffit ...
Comintern
Je pense que ce doit être un nombre car s'il s'agit d'une lettre, elle sera traitée comme une variable, mais comme une chaîne, les guillemets sont obligatoires et ils gaspillent des octets. : P
MathuSum Mut
1
@QPaysTaxes MathuSum l'a corrigé. La seconde 1doit être un certain nombre pour que l'analyse implicite fonctionne correctement. Tout ce [0-9]qui marcherait fonctionnerait de la même manière.
AdmBorkBork
1
@Nacht Peut-être que c'est une bizarrerie de mon environnement particulier, alors. Dans mon ISE (PSv4 Win8.1), le remplacement du second 1par quelque chose de non numérique (et non spécifié comme .\aou a.txtsimilaire) entraîne une erreur d'analyse.
AdmBorkBork
28

Pyth, 6 octets

#.w]]0

La seule commande de sortie de fichier de Pyth est .w. Lorsqu'il est appelé sur une chaîne, il écrit cette chaîne dans un fichier en mode ajout, ce qui ne sert à rien pour les besoins de cette question. Lorsqu'il est appelé sur un tableau 2D, il écrit l'image correspondante dans ce fichier, en remplaçant le contenu du fichier. C'est ce que fait ce programme. Le nom de sortie du fichier par défaut est o.png, de sorte que ce programme écrase infiniment le fichier o.pngavec une image blanche de 1 pixel. #est une boucle infinie.

isaacg
la source
27

Si vous voulez une réponse plus courte (mais plus ennuyeuse que mon autre):

Bash, 5 octets

>w;$0

Je pourrais rendre cela plus court s'il y avait une commande (moins de 3 octets) qui écrit quelque chose sur les E / S du disque. Quelque chose comme ça syncmarcherait, mais syncc'est 4 octets

Remarque: cela ne fonctionne pas lorsqu'il est exécuté directement à partir de bash, uniquement lorsqu'il est placé dans un script et exécuté sous le nom du script. (ie echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)

Daniel
la source
1
On dirait que c'est un lien entre moi et @isaacg - qui gagne?
Daniel
8
Je préfère utiliser exec(ou . $0). Je pense que cela va manquer de PID.
muru
1
Le premier est-il wnécessaire ici? Pour moi, >wcrée simplement un fichier vide wet le faire en boucle créera des E / S infinies, car les métadonnées mtime doivent être mises à jour en permanence.
Henning Makholm
1
Si cela vous qualifie @HenningMakholm, je le mettrai dedans.
Daniel
2
Le script contient uniquement ces octets. Puisqu'il est bash il n'y a aucun compilateur ou quelque chose de fantaisie nécessaire.
Daniel
16

Ruby, 22 à 20 octets

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

À plusieurs reprises, tronque et écrit un 1dans le fichier a.

Merci à Ventero pour 2 octets!

Poignée de porte
la source
3
open(?a,?w)<<1pour sauvegarder 2 octets.
Ventero
Merci, poignée de porte, de nous avoir honorés de votre présence. Je suis humble
MathuSum Mut
Est-ce que les descripteurs de fichier de fuite? Ou est-ce qu'il se ferme lorsqu'il sort du champ d'application? (Ruby IDK, désolé).
Peter Cordes
13

cmd, 14 octets

:a
cd>1
goto a

Écrase infiniment le fichier 1avec la chaîne dans le répertoire en cours


Je suis nouveau ici: les nouvelles lignes de Windows ( CR LF) sont-elles comptées comme deux octets?

MrPaulch
la source
13
Bienvenue chez PPCG! Windows, du moins les systèmes modernes, devrait pouvoir fonctionner LFsans problème. Ce qui précède fonctionne pour moi uniquement avec LFWindows 8.1, vos 14 octets sont donc corrects.
AdmBorkBork
CR LF2 CR1 LF1
Erik the Outgolfer
13

Bash + coreutils, 10

yes \>b|sh

Écrit un flux continu de >b, qui est dirigé vers shpour évaluation. >btronque simplement un fichier appelé bà zéro octet à chaque fois.

Trauma numérique
la source
4
+1 parce que votre nom est vraiment approprié à ce que fera cet extrait de code
Olivier Dulac
Pourquoi bet pas c?
CalculatorFeline
9

Perl 5, 27 32 22 octets

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

Si le simple changement de l'horodatage de modification d'un fichier suffit ...

Explication rapide:

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

Solution précédente (32 octets): {{open my$h,'>o';print$h 1}redo}

Edit: {open F,'O';print F 1;redo} ← N'a pas testé le code avant de poster; maintenant je devais le corriger.

g4v3
la source
1
: o une variable perl non préfixée par $!
chat
@cat: Ce n'est pas une variable régulière, comme un scalaire, un tableau ou un hachage. C'est simplement un mot simple. Selon le contexte, un mot simple peut être pris comme une sous-fonction (une fonction), un glob, je pense, ou un descripteur de fichier. (Peut-être que d'autres aussi?)
g4v3
8

PHP, 60 30 17 16 15 octets

Mis à jour encore une fois selon les suggestions de @manatwork:

while(!`cd>1`);

Aussi maintenant testé.


Un peu de tricherie 22 octets:

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

Suggestion précédente de @manatwork 30 octets:

while (file_put_contents (1,1));

NOT TESTED (pas de php disponible sur cet ordinateur) 43 octets:

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

Un original golfique de 45 octets:

$ a = fopen (1, 'w'); tandis que (fputs ($ a, 1)) rembobine ($ a);

Mon premier post ici, rejoint parce que je devais simplement essayer ceci: tant que l'écriture de fichier réussit, rembobinez le pointeur de fichier pour commencer.


Ne peut tout simplement pas être plus petit que file_put_contents ().

Diynevala
la source
5
while(file_put_contents(1,1));devrait suffire. Notez que l’exécution de scripts complets à partir de la ligne de commande php -r '…'est acceptable comme consensus sur la méta Exécution de PHP avec -rdes balises de code .
manatwork
S'agit-il d'une écriture sur le disque ou d'un tampon en mémoire?
Brice M. Dempsey
1
@manatwork Oh man! Je savais qu'il y avait toujours place à l'amélioration, mais tant pis… dommage que cette fonction n'ait pas un nom plus court. : D Je ne sais pas pour le tampon .. Je me demande si je devrais mettre à jour la réponse avec cette solution plus courte.
diynevala
2
Si c'est plus court, veuillez mettre à jour votre réponse, allez-y! :)
MathuSum Mut
Est-il permis d'appeler exec () depuis php? Je me rends compte qu'il n'est plus dans la "portée" de php.
Diynevala
7

sh, 11 octets

w>w;exec $0

Enregistrez-le dans un fichier sans caractères spéciaux, tel que loop.sh, rendez-le exécutable et exécutez-le avec ./loop.shou similaire.

Ceci écrit la sortie de la commande wdans le fichier w, écrasant la valeur précédente à chaque fois. Ensuite, il se remplace par une nouvelle version du même programme, afin de pouvoir fonctionner à l'infini.

isaacg
la source
il manque une seconde >. de plus, en supposant que vous ayez un $PATHsystème de fichiers / umask "spécial" et "spécial", vous pouvez vous permettre de le w>>w;$0
ramener
@mnagel >>is append, il finira par remplir le disque
cat
1
@ mnagel mais vous avez raison de ne pas avoir besoin d'un exec, je ne m'en étais pas rendu compte. Quelqu'un l'a déjà fait, alors je ne ferai pas de mise à jour
isaacg
3
Ou . $0au lieu de exec $0peut-être? Je ne sais pas si cela va provoquer un débordement de pile ou autre. ... Oui, il a été défectueux.
muru
7

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

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

Encore une fois, sudo watch -n1 lsof -p `pidof inf`semble dire que c'est valide.

COMMENT NE VOIS-JE PAS CET ESPACE D: <

Merci @Jens d' avoir réduit 13 octets: D

chat
la source
1
Le w+mode est en lecture et en écriture, tronquant initialement le fichier. Comme vous n'avez pas besoin de lire, vous pouvez supprimer un octet avec just w, ce qui tronque également le fichier, mais ne l'ouvre pas en mode lecture.
Mego
1
Pas besoin return 0;si la boucle ne se termine jamais.
Jens
1
Pourquoi ne pas utiliser à la fputc(1,f)place du super-verbeux fprintf(f," ")?
Jens
1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}depuis un conditionnel vide en formoyens true. 76 octets.
Jens
1
@PeterCordes PPCG n'est pas un débordement de pile; veuillez ne pas modifier les réponses des autres personnes qui changent de code ou d'autres parties majeures de la réponse. Les corrections typographiques sont acceptables, mais tout ce qui va au-delà (y compris les corrections d’énoncés factuels incorrects) devrait être suggéré dans les commentaires.
Chat
6

Bash, 26 octets

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

Si je devais développer ce one-line, j'obtiendrais ceci:

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

Cela ne peut pas rivaliser avec la ligne PowerShell de 10 octets, mais elle se démarquera des autres. Voir mon autre réponse pour la version à 6 octets.

Daniel
la source
2
while :;ls>l;done
User112638726
1
Le bon vieux exectruc va faire mieux: ls>l;exec $0. Plus court, mais ennuyeux.
manatwork
:>l;exec $0- la création de fichier est en train d'écrire l'inode
user24582
7
Même si vous supprimez y, vous yescontinuerez à écrire sur le même descripteur de fichier qu’il possédait. Courez lsof | grep yeset vous devriez voir quelque chose comme /path/to/y (deleted). Cela va remplir le disque et échouer.
Muru
4
Au lieu de rm yvous pouvez utiliser >yce qui tronquera le fichier existant. C'est aussi un peu plus court.
aragaer
6

TI-BASIC, 12 octets

While 1
Archive A
UnArchive A
End

Solution alternative de l'utilisateur lirtosiast avec la même taille:

While 1
SetUpEditor
Archive ∟1
End

Cela fonctionnera avec les calculatrices des séries TI-83 + et TI-84 +.

Oui, cela fonctionne aussi si A est déjà archivé ou n'est pas initialisé du tout au début du programme! Le programme n’a que 12 octets à cause de la tokenisation .

Jamy Mahabier
la source
Je ne sais pas si la mémoire flash utilisée par les calculatrices compte comme "disque".
lirtosiast
1
@lirtosiast À la défense de Jamy, les SSD sont constitués d'une mémoire flash =)
Cort Ammon
Dans tous les cas, le nombre d'octets est inférieur d'au moins 10 octets. L'écran 2nd Mem compte un en-tête égal à 9 octets + la longueur du nom du programme, mais nous ne le faisons pas ici pour vous permettre de le soustraire.
lirtosiast
@lirtosiast Ceci écrit et lit à plusieurs reprises dans la ROM (mémoire permanente) de la calculatrice, pas dans la RAM. Bien sûr, les calculatrices n'ont pas de disque dur réel à l'intérieur :)
Jamy Mahabier
@lirtosiast Merci, je n'en savais rien! (Je me demandais pourquoi la quantité d'octets déclarée par ma TI-84 + ne correspondait pas à mon comptage manuel ...) J'ai mis à jour ma réponse.
Jamy Mahabier
6

CPython 3.5, 33 16 octets

while 1:open("a")

Oui vraiment. :RÉ

chat
la source
while 1:open("a","w")est plus court et stracemontre que python effectue des opérations d’ouverture / fermeture fstat64 et close, sans aucun doute. Si le fichier aexiste déjà, il peut être encore plus court: ce while 1:open('a')qui génère encore un open, fstat64et close, et même modifie atimedu fichier.
Radovan Garabik
@ RadovanGarabík: 0 Merci, je ne connaissais pas cette information utile! Bien sûr, c'est spécifique à la mise en œuvre.
chat
5

MATL , 10 octets

`1[]T3$Z#T

Explication

Il s'agit d'une boucle infinie qui écrit le numéro 1 dans un fichier appelé inoutdans le répertoire en cours, écrasant le contenu du fichier précédent.

`       % 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
la source
5

Haskell, 20 octets

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

Ecrivez la chaîne "a"dans un fichier nommé "b"et recommencez. writeFileécrase le fichier s'il existe.

nimi
la source
4

JavaScript (Node.js), 43 41 octets

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

Écrit nulldans un fichier nommé a, puis recommencez.

Michał Perłakowski
la source
1
Qu'en est-il de l'écriture cou xdu fichier? Enregistre 2 octets. Aussi, ne require`fs`fonctionne pas ?
Charlie
1
@Charlie Bon point avec l'écriture cou x. require`fs`Malheureusement, cela ne fonctionne pas, parce que l'appel d'une fonction à l'aide de backticks appelle les premiers arguments comme suit ["fs"](array, dont le premier et unique élément est la chaîne passée) au lieu de "fs"(uniquement la chaîne). Essayez console.log`test`par exemple.
Michał Perłakowski
4

ZSH, 14 octets

for ((;;)) :>:

Zsh, contrairement à Bash et aux autres coques de type Bourne, autorise les boucles sans la do ... doneclôture , à condition que la condition soit correctement délimitée.

Alternativement, avec while:

while {} {:>:}

Notez que :c'est un construit. Vous ne pouvez pas suspendre cette boucle.

Le principe est le même que dans la réponse de Digital Trauma : rien n'est écrit dans le fichier, l'IO provient uniquement de la création et de la troncature du fichier.

muru
la source
Je dois dire, je n'aurais jamais pensé voir le muru, le muru, venir jouer à Code Golf. Bienvenue sur PPCG: D
cat
1
@cat Merci. : DI ont déjà joué une fois.
muru
3

Rouille, 84 octets

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

File::create tronque un fichier existant, assurant ainsi que nous ne manquons pas d’espace disque.

Le compilateur utilisé (1.9 Nightly) émet un avertissement sur le résultat inutilisé de write(...)mais compile néanmoins.

ECS
la source
3

C, 92 octets

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

Bien qu’il semble que vous puissiez économiser 1 octet sur

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

Le problème avec cette boucle est que + ne vous donne pas l'ordre garanti.

Ou récursif - ne devrait pas déborder si le compilateur implémente correctement la récursion finale (f est dans une portée interne explicite)

85 octets

#include <stdio.h>
main(){{FILE*f=fopen("a","w+");fprintf(f," ");fclose(f);}main();}
MSalters
la source
Espérons que la version de 85 octets ne fait pas exploser la pile. : P
MathuSum Mut
2
@MathuSumMut: Solution facile: nécessite une compilation avec optimisations. La récursion des appels de queue sauve la journée.
Josué
1
Il y a beaucoup de possibilités d'économiser des octets ici. Voir ma réponse pour emballer des choses à l'intérieur du for(;;), et pour des fonctions plus courtes que fprintf. Si vous avez besoin d'inclure stdio.h (ce que vous n'avez pas), vous n'avez pas besoin d'espace:#include<stdio.h>
Peter Cordes
3

Mathematica, 14 octets

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

Ecrit à plusieurs reprises la chaîne "a"dans un fichier nommé adans le répertoire en cours, en la créant si elle n'existe pas.

LegionMammal978
la source
écrirait-il la chaîne "a" ou le contenu de la variable a? Et si ces derniers, que ferait-il si cette variable n'était pas encore définie?
Michael Stern
@MichaelStern Il écrit la variable a, qui n'est pas définie, donc il écrit a\n.
LegionMammal978
3

C, 40 octets

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

Il va rapidement manquer de descripteurs de fichiers; ceci peut être surmonté avec:

45 , 43 octets

main(f){for(f=open("a",1);;)write(f,"",1);}
Edmz
la source
Pourquoi f n'a pas de type dans le second?
Cat
2
@cat En C (très style K & R), la valeur par défaut est int.
Edmz
1
gcc et clang ne compileront pas la 2e version. Même GNU C ne permet pas l'initialisation dynamique d'une variable statique / globale (un appel à open()n'est pas une constante de compilation). En outre, il manquera d’espace disque, car il n’ya pas de code lseek. Essayez peut-être utime("a","")dans la boucle, qui continuera à mettre à jour le ctime. (Vous devez encore opencréer un fichier de nom connu).
Peter Cordes
@PeterCordes Vous avez raison, merci de nous l'avoir signalé. Fixé.
Edmz
Ne répond toujours pas à l'exigence de l'OP de ne pas remplir le disque éventuellement, mais peut-être encore utile de garder une réponse. (Sauf si vous avez une idée meilleure que la fermeture / réouverture de ma réponse (O_TRUNC) dans une boucle.) Contrairement à mon commentaire précédent, la mise à jour des horodatages ne produit généralement pas réellement d'entrées / sorties de disque sous Linux. Comme peut-être une écriture par 24 heures avec lazytime, comme je l'ai dit dans ma réponse.
Peter Cordes
3

C sur amd64 Linux, 36 octets (horodatage uniquement), 52 49 octets (activité réelle du disque)

Je code en dur les open(2)drapeaux, donc ce n'est pas portable pour les autres ABI. Linux sur d'autres plates-formes utilise probablement la même chose O_TRUNC, etc., mais pas les autres systèmes d'exploitation POSIX.

+4 octets pour passer un argument d'autorisation correct afin de vous assurer que le fichier est créé avec un accès en écriture propriétaire, voir ci-dessous. (Ceci arrive avec gcc 5.2)

ANSI C relativement portable, 38/51 octets (horodatage uniquement), 52/67 octets (activité réelle du disque)

Basé sur la réponse de @Chat, avec un conseil de @Jens.

Le premier nombre est destiné aux implémentations dans lesquelles une valeur intpeut être FILE *fopen()retournée, le deuxième nombre si nous ne pouvons pas le faire. Sous Linux, il se trouve que les adresses de segment de mémoire se situent dans les 32 bits d'espace disque, de sorte que cela fonctionne même sans -m32ou -mx32. (Déclarer void*fopen();est plus court que #include <stdio.h>)


Métadonnées d'horodatage I / O uniquement :

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

Écrire un octet, frapper le disque sous Linux 4.2.0 + XFS + lazytime:

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

writeest la condition de boucle for, ce qui est correct car elle renvoie toujours 1. closeest l'incrément.

// 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

Explication de la version non portable:

Le fichier est créé avec des autorisations aléatoires. Avec gcc5.2, avec -O0ou -O3, il arrive que l’autorisation d’écriture du propriétaire soit incluse, mais cela n’est pas garanti. 0666est un nombre décimal 438. Un 3ème argument openprendrait encore 4 octets . Nous sommes déjà en train de coder en dur O_TRUNC, etc., mais cela pourrait rompre avec un compilateur ou une libc différent sur le même ABI.

Nous ne pouvons pas omettre le 2nd argument open, car la valeur de garbage inclut O_EXCL, et O_TRUNC|O_APPENDdonc, open échoue avec EINVAL.


Nous n'avons pas besoin de sauvegarder la valeur de retour de open(). Nous supposons que c'est 3parce que ça le sera toujours. Même si nous commençons par ouvrir fd 3, il sera fermé après la première itération. Dans le pire des cas, opencontinue d'ouvrir de nouveaux fichiers jusqu'à ce que 3 soit le dernier descripteur de fichier disponible. Ainsi, jusqu'aux premiers 65531 write()appels pourraient échouer avec EBADF, mais fonctionneront ensuite normalement avec chaque opencréation fd = 3.

577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCsous Linux x86-64. Sans cela O_TRUNC, le temps d'inode mod et le temps de changement ne sont pas mis à jour, donc un argument plus court n'est pas possible. O_TRUNCest toujours essentiel pour la version qui appelle writepour générer une activité de disque réelle et non pour réécrire en place.

Je vois des réponses qui open("a",1). O_CREAT est requis s'il an'existe pas déjà. O_CREATest défini comme octal 0100 (64, 0x40) sous Linux.


Aucune ressource ne fuit, elle peut donc fonctionner pour toujours. stracesortie:

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

ou

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

J'ai eu la valeur décimale des opendrapeaux pour cette ABI en utilisant strace -eraw=openma version C ++.

Sur un système de fichiers avec l' lazytimeoption de montage Linux activée, une modification qui affecte uniquement les horodatages d'inode ne provoquera qu'une écriture par 24 heures. Avec cette option de montage désactivée, la mise à jour d'horodatage peut constituer un moyen viable d'user votre disque SSD. (Cependant, plusieurs autres réponses ne font que des métadonnées d'E / S).


alternatives:

plus court non-travail :

main(){for(;;)close(write(open("a",577),"",3));}utilise writela valeur de retour pour passer un 3argument à fermer. Il enregistre un autre octet, mais ne fonctionne pas avec gcc -O0 ou -O3 sur amd64. La poubelle du 3ème argument openest différente et n'inclut pas l'autorisation d'écriture. aest créé la première fois, mais les itérations futures échouent -EACCESS.

plus long, fonctionnel, avec différents appels système :

main(c){for(open("a",65);pwrite(3,"",1);)sync();} réécrit un octet sur place et appelle sync()à synchroniser tous les systèmes de fichiers à l'échelle du système. La lumière de lecteur reste allumée.

Nous ne nous soucions pas de quel octet, nous ne passons donc pas le 4ème argument à écrire. Yay pour les fichiers clairsemés:

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

Écrire un octet avec un décalage de ~ 128 To a conduit xfs à utiliser 300 ko d'espace pour contenir la carte d'étendue, je suppose. N'essayez pas ceci sur OS X avec HFS +: IIRC, HFS + ne supporte pas les fichiers fragmentés, il va donc remplir le disque.

XFS est un système de fichiers 64 bits approprié, prenant en charge des fichiers individuels allant jusqu'à 8 exaoctets . c'est-à-dire 2 ^ 63-1, la valeur maximale off_tpeut être retenue.

strace sortie:

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
la source
2

Raquette, 46 octets

(do()(#f)(write-to-file'a"f"#:exists'replace))
Winny
la source
1
Je pensais répondre à Racket, mais vous m'y avez battu. : P
cat
Par curiosité, avez-vous trouvé une réponse plus courte?
Winny
1

Facteur, 73 octets

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

Définit le contenu du fichier sur l'octet nul pour toujours.

chat
la source
1

CBM BASIC 7.0, 9 octets

0dS"a":rU

Ce programme, lorsqu'il est exécuté, s'enregistre de manière répétée sur le disque. Voici une version plus lisible qui n'utilise pas les abréviations de mots-clés BASIC:

0 dsave "a" : run
Psychonaute
la source
1
Est-ce qu'il manque de cassette? ;)
MathuSum Mut
1
@MathuSumMut cela serait0 SAVE "A" : RUN
ceilingcat le
1

Python, 32 octets

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

Notez que s'il est exécuté sur python 3, cela produira un nombre infini d'avertissements. En outre, il manquera probablement de fds s'il est exécuté dans une implémentation sans calcul en parallèle.

poivré
la source
Tout comme une note, une réponse plus courte existe sans la writeet la "w"partie de la commande open.
Rɪᴋᴇʀ
1

Dyalog APL 15.0, 17 octets (non concurrents)

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

Chrome rend actuellement U + 2262 incorrect. La ligne ci-dessus devrait ressembler (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.

Ceci n’est pas concurrentiel car la version 15 n’a pas encore été publiée.

Applique la fonction (⊢⊣⊃⎕NPUT⊢)sur 'A'1jusqu'à ce que l'entrée est modifié (jamais):

⊢⊣⊃⎕NPUT⊢ est un train de fonction:

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

Le plus à droite revient 'A'1non modifié; ceci (nom de fichier, overwrite-flag) sera le bon argument pour ``NPUT '.

'' Renvoie le premier élément de 'A'1( 'A'); ce sont les données à écrire.

Ensuite, ⎕NPUTest exécuté et indique le nombre d'octets écrits (2 ou 3 selon le système d'exploitation); cela devient le bon argument pour le .

Le plus à gauche retourne à nouveau 'A'1non modifié; c'est l'argument de gauche à la .

ignore son argument de droite et renvoie l'argument de gauche ( 'A'1), cela devient la nouvelle valeur alimentée .

Comme la nouvelle valeur est identique à l’ancienne, l’opération est poursuivie (pour toujours).

Adam
la source
1

SmileBASIC, 12 octets

SAVE"A
EXEC.
12Me21
la source
Ne manque-t-il pas de cassette?
MathuSum Mut
0

éditeur de texte vim, 10 octets

qa:w<enter>@aq@a

8 octets si vous ne pouvez pas la commande d'exécution @a

Radovan Garabík
la source