Sonsuz disk G / Ç için en kısa kod


49

(Sadece Google Chrome'da 50 sekme açın: D (şaka yapıyorum, yapamazsınız)

Herhangi bir dilde sonsuz disk G / Ç için en kısa kod, C # örneği:

using System.IO;

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

Ancak diskin tamamını dolduramazsınız, çünkü sonunda durur ve sonlu olur.

Ve sadece okuma yapamazsın, sonsuz yazı olmak zorunda. (Yeterli çalışma süresinden sonra SSD'mi öldürmek zorunda.)

Çatlak ol! :)


6
Does okuma onları da Disk I / O olarak saymak yazmak yerine dosyaları? Peki ya yazmaya /dev/null? ( yes>/dev/nullGeçerli bir Bash cevap mı?)
Doorknob

2
Herhangi bir giriş alabilir mi?
Kullanıcı112638726

29
Dang man ... SSD'niz sana ne yaptı?
R. Kap

2
6 baytlık çözümlerle rekabet etmeyi umduğum için, dosyayı yaratmam ./a 3 byte içeriğiyle. AFAIK, sadece bir dosyayı çalıştırmak, bazı sistem dosyalarının birçok sistemde yer almasına neden olur , çünkü en azından 'son erişim zamanında' bir yan ürün olarak güncellenir ;-)
Stilez

3
Bu cevapların çoğu tekrar tekrar aynı alana veri yazacaktır. Bu, veri farklı olsa bile gerçek bir disk yazma ile sonuçlanmaz. (Ekstrem durum, dos -> windows iletişimi. 4k veri dos yazdım ve Windows'da tekrar okudum - veriler
aktığından

Yanıtlar:


26

DOS / Toplu İş: 4 bayt

%0>x

Bu toplu iş dosyası kendisi çağırır ( %0) ve >çıktıyı bir dosyaya yönlendirir ( ) x. Yankı varsayılan olarak açık olduğundan, bu yol ve komutu çıkarır.


Sonunda disk alanı tükenir mi, yoksa çıkışın üzerine yazılır mı?
MathuSum Mut

1
@MathuSumMut: Bununla >yazılacak. >>ekleyecekti
Thomas Weller

1
O zaman sen kazandın sanırım: P
MathuSum Mut

2
@ ΈρικΚωνσταντόπουλος: Bu doğru. Bu durumda, 0 baytlık bir dosya üretilir, bu zorluğun beklediği şekilde G / Ç üretilmez. Ama her vakayı göz önünde bulundurmak bizim görevimiz değil, aksi takdirde önbelleklemeyi, virüs tarayıcılarını kapatmak isteyebilirsiniz ...
Thomas Weller

1
0 baytlık bir dosya yazmak, dizindeki son değiştirilen zamanı güncellemesi gerektiğinden, hala disk G / Ç'ye neden olur.

48

PowerShell v2 +, 10 bayt

for(){1>1}

Sadece boş bir fordöngü ile sonsuz döngüler . Her yinelemede, yerel dizinde belirtilen dosyanın üzerine yazan redirect işleciyle1 ( tam olarak bir dizgeye dönüştürülmüş) tamsayıyı çıkarıyoruz .> 1


İkinci 1’i başka bir şeyle değiştirir misiniz (geçerli bir dosya adı yapar) veya 1 olmalı mı?
Nic Hartley

1
Windows VM'mde, Winload.exeyeterli ...
Comintern

Bir sayı olması gerektiğini düşünüyorum çünkü eğer bir harfse, o zaman değişken bir dizi gibi davranır, bir yazı dizisi tırnakları olarak kabul edilir ve bayt harcar. : P
MathuSum Mut

1
@QPaysTaxes MathuSum doğruladı. İkincisi 1, örtülü ayrıştırmanın doğru çalışması için bir tür sıralama gerektirmesi gerekir. Herhangi bir şey [0-9]aynı şekilde çalışırdı.
AdmBorkBork

1
@Nacht Belki o zaman benim özel çevremin bir tuhaflığı. İMKB'mde (PSv4 Win8.1), ikincisini 1sayısal olmayan bir şeyle (ya da .\aya a.txtda ya da benzeri şekilde belirtilmemiş ) değiştirmek, ayrıştırma hatasıyla sonuçlanır.
AdmBorkBork

28

Pyth, 6 bayt

#.w]]0

Pyth'in tek dosya çıktı komutu .w. Bir dizgide çağrıldığında, bu dizgiyi ekleme modunda bir dosyaya yazar; bu, bu sorunun amacı için iyi değildir. 2 boyutlu bir dizide çağrıldığında, karşılık gelen görüntüyü, dosya içeriğinin üzerine yazarak o dosyaya yazar. Bu programın yaptığı şey. Varsayılan dosya çıkış adı o.png, bu nedenle programın üzerine, o.png1 piksellik beyaz bir görüntü ile dosyanın üzerine sürekli olarak yazar . #sonsuz bir döngüdür.


27

Daha kısa (fakat diğerinden daha sıkıcı) bir cevap istiyorsanız:

Bash, 5 bayt

>w;$0

Diske G / Ç'ye bir şey yazan bir komut (3 byte uzunluğunda) varsa, bunu daha kısa yapabilirim. Gibi bir syncşey işe yarayacak, ancak sync4 bayt 😛

Not: Bu, doğrudan bash'ten çalıştırıldığında, yalnızca bir komut dosyasına koyup komut dosyası adı olarak çalıştırıldığında çalışmaz. (yani echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)


1
Görünüşe göre benimle @ isaacg arasında bir bağ var - kim kazanır?
Daniel

8
exec(Ya da . $0) kullanmayı tercih ederim . Bunun PID'lerin tükeneceğini düşünüyorum.
muru,

1
wBurada ilk gerekli mi? Benim için sadece >wboş bir dosya oluşturur wve bunu bir döngüde yapmak sonsuz G / Ç yaratacaktır çünkü mtime meta verilerinin sürekli güncellenmesi gerekir.
Henning Makholm

1
Eğer bu, @HenningMakholm'e hak kazanırsa, o zaman koyacağım.
Daniel

2
Betik sadece bu baytları içeriyor. Kesin olduğundan, derleyici ya da fantezi gerektiren bir şey yok.
Daniel,

16

Ruby, 22 20 bayt

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

Arka arkaya keser ve a 1dosyasına yazar a.

2 bayt için Ventero için teşekkürler !


3
open(?a,?w)<<12 bayt kaydetmek için.
Ventero

Varlığınızla bizi onurlandırdığınız için teşekkür ederiz, kapı kolu. Ben alçakgönüllüm.
MathuSum Mut

Bu dosya tanımlayıcıları sızdırıyor mu? Yoksa kapsam dışına çıktığında kapanıyor mu? (IDK Ruby, üzgünüm).
Peter Cordes

13

cmd, 14 bayt

:a
cd>1
goto a

Dosya 1dizgesini istemeden dizine yazar.


Ben burada yeniyim: Windows yeni satırlar ( CR LF) iki bayt olarak sayılıyor mu?


13
PPCG'ye Hoşgeldiniz! Windows, en azından modern sistemler, sadece LFsorunsuzca başa çıkabilmelidir. Yukarıdakiler sadece LFWindows 8.1'de benim için çalışıyor , bu yüzden 14 baytınız doğru.
AdmBorkBork

CR LF2 CR1 LF1
Outgolfer Erik,

13

Bash + coreutils, 10

yes \>b|sh

Oluşan sürekli bir akımın yazar >btaşınıyor, shdeğerlendirme. >bsadece bher seferinde sıfır bayt olarak adlandırılan dosyayı keser .


4
+1, çünkü adınız bu kod snippet'inin ne yapacağına gerçekten uygun
Olivier Dulac

Neden bve değil c?
CalculatorFeline

9

Perl 5, 27 32 22 bayt

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

Bir dosyanın değişiklik zaman damgasını değiştirmek yeterliyse ...

Hızlı açıklama:

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

Önceki çözüm (32 bayt): {{open my$h,'>o';print$h 1}redo}

Düzenleme: {open F,'O';print F 1;redo} ← Göndermeden önce kodu test etmedim; şimdi düzeltmek zorunda kaldım.


1
: oa perl değişkeni önceden eklenmemiş $!
kedi

@ cat: Skaler, dizi veya karma gibi normal bir değişken değildir. Bu sadece bir korkak. Bağlama bağlı olarak, bir korkak bir alt (işlev), bir küre, sanırım veya bir dosya askısı olarak alınabilir. (Belki diğerleri de?)
g4v3

8

PHP, 60 30 17 16 15 bayt

@Manatwork'ün önerdiği şekilde bir kez daha güncellendi:

while(!`cd>1`);

Ayrıca şimdi test edildi.


22 bayt hile biraz:

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

@Manatwork 30 bytes tarafından daha önce yapılan öneri:

ise (file_put_contents (1,1));

TEST DEĞİL (bu bilgisayarda php mevcut değil) 43 bayt:

için (; fputs ($ a, 1); $ a = Fopen (1) 'w' fclose ($ a)),

Bir golf orijinal 45 bayt:

( 'W' 1) = fopen, $ (fputs ($ a, 1)) geri sarma sırasında ($ a);

Buradaki ilk gönderim, katıldım çünkü şunu denemeliydim: dosya yazma başarılı olduğu sürece, dosya göstericisini başlatmak için geri sar.


Sadece file_put_contents () 'den daha küçük olamaz.


5
while(file_put_contents(1,1));yeterli olmalı. Komut satırından tam olarak komut dosyaları çalıştırmanın php -r '…'meta etiketler yerine PHP çalıştırma-r konusunda fikir birliğine göre kabul edilebilir olduğunu unutmayın .
Manatwork

Bu aslında diske mi yazıyor yoksa bellekteki bir arabellek mi?
Brice M. Dempsey

1
@ manatwork Oh adam! Her zaman iyileştirmeye yer olduğunu biliyordum, ama o kadar da kötü ki, bu işlevin adı daha kısa değildi. : DI arabellek hakkında hiçbir şey bilmiyorum .. Acaba cevabı bu kısa çözümle güncellemem gerekip gerekmediğini merak ediyorum.
diynevala

2
Eğer daha kısa ise, lütfen cevabınızı güncelleyin, devam edin! :)
MathuSum Mut

Php'den exec () işlevine izin verilir mi? PHP'nin "kapsam" ında artık olmadığını fark ettim.
diynevala

7

sh, 11 bayt

w>w;exec $0

Bunu loop.sh gibi özel karakterleri olmayan bir dosyaya kaydedin, çalıştırılabilir hale getirin ve ile ./loop.shbenzer şekilde çalıştırın .

Bu komutun çıktısını her seferinde önceki değerin üzerine yazarak wdosyaya wyazar. Daha sonra, aynı programın yeni bir versiyonuyla yerini alır, böylece sonsuz şekilde çalışabilir.


bu bir saniye eksik >. Ayrıca, bir "özel" olduğunu varsayarak $PATHve "özel" umask'ı / dosya sistemi, sizin için gidebilirsiniz w>>w;$07 karakter için aşağı salamura,
mnagel

@mnagel >>eklenir, sonunda diski doldurur
cat

1
@mnagel ama icraya gerek duymama konusunda haklısın, bunun farkında değildim. Başka biri yaptı, bu yüzden güncelleme yapmam, ancak
isaacg

3
Veya . $0yerine exec $0belki de? Bununla birlikte, bunun çalışıp istif taşmasına ya da başka bir şeye neden olup olmayacağını bilmiyorum. ... Evet, kırıldı.
muru

7

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

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

Yine, sudo watch -n1 lsof -p `pidof inf`bunun geçerli olduğu söyleniyor.

NASIL UZAY DEĞİLDİR D: <

13 byte'ı tıraş ettiğin için teşekkürler @Jens : D


1
w+Mod okumak ve başlangıçta dosyayı kesiliyor, yazma. Okumanıza gerek olmadığından, sadece bayt ile tıraş edebilirsiniz w, bu da dosyayı keser, ancak dosyayı okuma modunda açmaz.
Mego

1
return 0;Döngünün hiç bitmemesi için gerek yok .
Jens

1
fputc(1,f)Süper ayrıntılı yerine neden kullanılmıyor fprintf(f," ")?
Jens

1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}boş bir koşullu foranlamına gelir true. 76 bayt.
Jens

1
@PeterCordes PPCG Yığın Taşması değil; lütfen başkalarının cevaplarında kod değiştirecek veya cevabın diğer bölümlerinde değişiklik yapmayın. Yazım hataları düzeltildi, ancak yorumlardaki (aslında yanlış ifadelerin düzeltilmesi de dahil olmak üzere) herhangi bir beyod önerilmeli.
kedi,

6

Bash, 26 bayt

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

Bu tek astarı genişletmek isteseydim şunu alırdım:

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

Bu tam olarak 10 baytlık PowerShell hattıyla rekabet edemez, ancak diğerlerine karşı kendi aittir. 6 byte versiyonu için diğer cevabımı görün.


2
while :;ls>l;done
Kullanıcı112638726

1
Eski güzel exechüner daha iyi yapacağız: ls>l;exec $0. Daha kısa ama sıkıcı.
Manatwork

:>l;exec $0- dosya oluşturma inode yazıyor
user24582

7
Silseniz bile y, yessahip olduğu dosya tanıtıcısına yazmaya devam edecek. Koş lsof | grep yesve böyle bir şey görmelisin /path/to/y (deleted). Bu diski doldurur ve başarısız olur.
muru

4
Bunun yerine mevcut dosyayı kesecek olanı rm ykullanabilirsiniz >y. Aynı zamanda biraz daha kısa.
aragaer

6

TI-BASIC, 12 bayt

While 1
Archive A
UnArchive A
End

Aynı boyutta kullanıcı lirtosiast tarafından alternatif çözüm :

While 1
SetUpEditor
Archive ∟1
End

Bu, TI-83 + ve TI-84 + serisi hesap makineleri üzerinde çalışacaktır.

Evet, bu aynı zamanda A programın başında arşivlenmişse veya hiç başlatılmamışsa da işe yarar! Program, belirtecleme nedeniyle yalnızca 12 bayttır .


Hesap makineleri tarafından kullanılan flash belleğin "disk" olarak sayılıp sayılmadığını bilmiyorum.
lirtosiast,

1
@lirtosiast Jamy'nin savunmasında, SSD'ler flash bellekten yapılmıştır =)
Cort Ammon

Her durumda, bayt sayısı en az 10 bayt daha azdır. 2nci Mem ekranı 9 byte + program adının uzunluğuna eşit bir başlık sayar, fakat biz onu çıkarmamak için burada değiliz.
lirtosiast

@ lirtosiast Bu, RAM'a değil, art arda hesap makinesinin ROM'una (kalıcı bellek) yazar ve okur. Elbette, hesap makineleri içinde gerçek bir sabit disk yok :)
Jamy Mahabier

@lirtosiast Teşekkürler, bunu bilmiyordum! (TI-84 + 'a bildirdiğim bayt miktarının neden el sayımla eşleşmediğini merak ediyordum ...) Cevabımı güncelledim.
Jamy Mahabier,

6

CPython 3.5, 33 16 bayt

while 1:open("a")

Evet gerçekten. : D


while 1:open("a","w")kısadır ve stracepython'un açık, fstat64 ve close, kesinlikle G / Ç işlemleri yaptığını gösterir. Dosya azaten varsa, daha da kısa olabilir: while 1:open('a')ki bu hala bir open, fstat64ve close, hatta hatta atimedosyada değişiklikler üretir .
Radovan Garabík

@ RadovanGarabík: 0 Teşekkürler, bu kullanışlı bilgiyi bilmiyordum! Tabii ki, uygulamaya özgü.
kedi,

5

MATL , 10 bayt

`1[]T3$Z#T

açıklama

Bu, önceki dosyanın içeriğinin üzerine yazarak geçerli dizinde 1 adı verilen bir dosyaya sayı yazan sonsuz bir döngüdür inout.

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

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

Dizeyi "a"bir dosyaya yazın "b"ve tekrarlayın. writeFileeğer varsa dosyanın üzerine yazar.


4

JavaScript (Node.js), 43 41 bayt

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

nullAdlı bir dosyaya yazar a, sonra tekrar eder.


1
Peki ya yazma cya xda dosyaya? 2 bayt kaydeder. Ayrıca, çalışmıyor require`fs`mu?
Charlie

1
@Charlie cveya yazısı ile iyi bir nokta x. require`fs`maalesef işe yaramıyor, çünkü bir işlevi çağırmak için backticks kullanmak, onu yerine ilk argümanlarla çağırır ["fs"](dizi, ilk ve tek eleman iletilen dizgedir) "fs"(sadece dizge). console.log`test`Örneğin deneyin .
Michał Perłakowski

4

ZSH, 14 bayt

for ((;;)) :>:

Zsh, Bash ve diğer Bourne benzeri mermilerin aksine , koşulun uygun şekilde sınırlandırılması şartıyla çitsiz halkalarado ... done izin verir .

Alternatif olarak while:

while {} {:>:}

Bunun :bir yerleşik olduğunu unutmayın . Bu döngüyü askıya alamazsınız.

İlke, Digital Trauma'nın cevabındakiyle aynıdır - dosyaya hiçbir şey yazılmaz, IO tamamen dosyayı oluşturmaktan ve kesmekten ibarettir.


Söylemeliyim ki, muru, muru görmek için gelip Code Golf oynamaya hiç düşünmedim . PPCG'ye hoşgeldiniz: D
cat

1
@cat Teşekkürler. : DI daha önce bir kez oynadı.
muru

3

Pas, 84 Bayt

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

File::create varolan bir dosyayı keser, böylece disk alanımızın tükenmemesini sağlar.

Kullanılan Derleyici (1.9 Gecelik) kullanılmayan sonucu hakkında bir uyarı verir, write(...)ancak yine de derlenir.


3

C, 92 bayt

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

Görünüşe göre 1 byte tasarruf edebilirsiniz

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

Bu döngü ile ilgili sorun, + garantili düzeni vermemesidir.

Veya özyinelemeli - derleyici kuyruk özyinelemesini uygun şekilde uygularsa taşması olmamalıdır (f açık bir iç kapsamda)

85 bayt

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

Umarım 85 baytlık sürüm yığını etkilemez. : P
MathuSum Mut

2
@MathuSumMut: Kolay düzeltme: optimizasyonlarla derlemeyi gerektirir. Kuyruk çağrısı tekrarlama günü kurtarır.
Joshua,

1
Burada bayt tasarrufu için çok fazla alan var. İçindeki eşyaları paketleme for(;;)ve daha kısa işlevler için cevabımı görün fprintf. Stdio.h dosyasını eklemeniz gerekirse (ki kullanmazsınız), bir alana ihtiyacınız olmaz:#include<stdio.h>
Peter Cordes

3

Mathematica, 14 bayt

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

Diziyi , geçerli dizinde "a"adı verilen bir dosyaya yazar, ayoksa onu oluşturur.


"a" dizesini ya da a değişkeninin içeriğini mi yazardı? Ve eğer sonuncusu, eğer bu değişken henüz tanımlanmamışsa ne yapardı?
Michael Stern,

@MichaelStern aTanımsız olan değişkeni yazar , bu yüzden sadece yazar a\n.
LegionMammal978 20:16

3

C, 40 bayt

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

Ancak hızlı bir şekilde dosya tanımlayıcıları tükenir; bununla üstesinden gelinebilir:

45 , 43 bayt

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

Neden ikinci bir f türü yok?
kedi,

2
@ cat C (çok K&R tarzı) varsayılan olarak int.
edmz

1
gcc ve clang 2. sürümü derlemez. GNU C bile statik / global bir değişkenin dinamik olarak başlatılmasına izin vermez (bir çağrı open()derleme zamanı sabiti değildir). Ayrıca, disk alanı tükenir, çünkü lseek yoktur. Belki de utime("a","")güncellemeye devam edecek olan döngüde deneyin ctime. (Hala openbilinen bir isim oluşturmak zorundasınız ).
Peter Cordes

@PeterCordes Haklısın, işaret ettiğin için teşekkürler. Sabit.
edmz

Yine de OP'nin sonunda diski doldurmama gerekliliğini karşılamıyor, ancak hala bir cevap olarak tutmaya değer. (Bir döngüdeki cevabımın kapanması / tekrar açılmasından (O_TRUNC) daha iyi bir fikriniz olmadığı sürece.) lazytimeSanırım cevabımda dediğim gibi 24 saatte bir yazabilirim .
Peter Cordes

3

Amd64 Linux'ta C, 36 bayt (yalnızca zaman damgası), 52 49 bayt (gerçek disk etkinliği)

open(2)Bayrakları zor kodluyorum, bu yüzden diğer ABI'lara taşınabilir değil. Diğer platformlarda Linux muhtemelen aynı O_TRUNC, vb kullanır , ancak diğer POSIX işletim sistemleri olmayabilir.

+4 bayt , dosyanın sahibinin yazma erişimiyle oluşturulduğundan emin olmak için doğru bir izin argümanı iletmek için aşağıya bakın. (Bu, gcc 5.2 ile çalışır)

biraz taşınabilir ANSI C, 38/51 bayt (yalnızca zaman damgası), 52/67 bayt (gerçek disk etkinliği)

@Jens'in cevabına göre @Jens'tan bir ipucu ile.

İlk sayı, bir intkişinin FILE *fopen()dönüş değerini tutabileceği uygulamalar için , bunu yapamazsak ikinci sayıdır. Linux'ta, yığın adresleri düşük 32 bit adres alanı içinde olur, bu yüzden -m32ya da olmadan çalışır -mx32. (Beyanı void*fopen();daha kısa #include <stdio.h>)


Yalnızca zaman damgası meta verileri G / Ç :

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

Bir bayt yazmak, aslında Linux 4.2.0 + XFS + diskine basmaklazytime :

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

writefor-loop koşulu, her zaman 1 döndürdüğü için gayet iyi close. Artım.

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

Taşınabilir olmayan versiyonun açıklaması:

Dosya rasgele çöp izinleriyle oluşturulur. İle gccbirlikte 5.2, -O0veya -O3, sahibi yazma izni dahil olur, ancak bu garanti edilmemektedir. 0666ondalık: 438. Başka bir 4 byte alabilen üçüncü bir argümanopen . Zaten O_TRUNC kodlaması yapıyoruz, ancak bu aynı ABI'da farklı bir derleyici veya libc ile bozulabilir.

2. argümanı atlayamayız open, çünkü çöp değeri buna dahil olur O_EXCLve O_TRUNC|O_APPENDaçık bu nedenle başarısız olur EINVAL.


Dönüş değerini kaydetmemize gerek yok open(). Bunu varsayıyoruz 3, çünkü her zaman olacak. Fd 3 open ile başlasak bile, ilk yinelemeden sonra kapanacaktır. En kötüsü open, en son kullanılabilir dosya tanıtıcısı 3 olana kadar yeni fds açmaya devam ediyor. Böylece, ilk 65531'e kadar write()çağrı başarısız olabilir EBADF, ancak daha sonra her openyaratmada normal olarak çalışacaktır fd = 3.

577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCx86-64 Linux'ta. Olmadan O_TRUNC, inode mod zamanı ve değişim zamanı güncellenmez, bu nedenle kısa bir argüman mümkün değildir. O_TRUNChala writeyerine oturtulmadan değil, gerçek disk etkinliği oluşturmaya çalışan sürüm için hala gereklidir .

Buna bazı cevaplar görüyorum open("a",1). Henüz mevcut değilse a, O_CREAT gereklidir . O_CREATLinux'ta sekizlik 0100 (64, 0x40) olarak tanımlanmıştır.


Kaynak sızıntısı yok, bu yüzden sonsuza kadar çalışabilir. straceçıktı:

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

veya

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

Ben C ++ sürümünde openkullanarak bu ABI için bayrakların ondalık değerini aldım strace -eraw=open.

Linux lazytimemount seçeneğinin etkin olduğu bir dosya sisteminde , yalnızca inode zaman damgalarını etkileyen bir değişiklik 24 saatte yalnızca bir yazmaya neden olur. Bu takma seçeneği devre dışı bırakıldığında, zaman damgası güncellemesi SSD'nizi yıpratmanın uygun bir yolu olabilir. (Ancak, diğer bazı yanıtlar yalnızca meta veri G / Ç yapar).


alternatifler:

kısa olmayan çalışma :

main(){for(;;)close(write(open("a",577),"",3));}Kapatılacak writebir 3argümanı iletmek için 'return' değerini kullanır . Başka bir bayttan tasarruf eder, ancak amd64'te gcc -O0 veya -O3 ile çalışmaz. 3. argümandaki çöpler openfarklıdır ve yazma izni içermez. ailk kez yaratıldı, ancak gelecekteki yinelemelerin hepsi başarısızlıkla sonuçlandı -EACCESS.

daha uzun, çalışıyor, farklı sistem çağrılarıyla :

main(c){for(open("a",65);pwrite(3,"",1);)sync();} yerinde bir bayt yazar ve sync()tüm dosya sistemlerini sistem genelinde senkronize etmek için çağırır . Bu, sürüş ışığının yanmasını sağlar.

Hangi baytı umursamıyoruz, o yüzden 4. arg'ı yazmak için geçmiyoruz. Seyrek dosyalar için Yay:

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

Sanırım ~ 128 TB'lık bir ofsette bir bayt yazmak, genişlik haritasını tutmak için 300 kB'lik bir alan kullanan xfs'ye yol açtı. OS X'te HFS + ile deneme: IIRC, HFS + seyrek dosyaları desteklemediğinden diski doldurur.

XFS, 8 exabayta kadar tek tek dosyaları destekleyen uygun bir 64bit dosya sistemidir . yani 2 ^ 63-1, maksimum değer off_ttutabilir.

strace çıktı:

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

Raket, 46 bayt

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

1
Racket’te cevap vermeyi düşünüyordum ama sen beni yendin. : P
kedi

Meraktan daha kısa bir cevap buldunuz mu?
Winny

1

Faktör, 73 bayt

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

Dosya içeriğini sonsuza dek boş bayt olarak ayarlar.


1

CBM BASIC 7.0, 9 bayt

0dS"a":rU

Bu program, çalıştırıldığında, art arda kendini diske kaydeder. İşte BASIC anahtar kelime kısaltmalarını kullanmayan daha okunaklı bir sürüm:

0 dsave "a" : run

1
Olsa kaset bitti mi? ;)
MathuSum Mut

1
@MathuSumMut olur0 SAVE "A" : RUN
ceilingcat

1

Python, 32 bayt

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

Python 3 ile çalıştırıldığında, bunun sonsuz sayıda uyarı üreteceğini unutmayın. Ayrıca, yeniden sayılmayan bir uygulamada çalıştırılırsa büyük olasılıkla fds tükenir.


Sadece bir not olarak, daha kısa bir cevap vermeden mevcut writeve "w"açık komutunun parçası.
Rɪᴋᴇʀ

1

Dyalog APL 15.0, 17 bayt (yarışmacı olmayan)

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

Chrome, şu anda U + 2262'yi yanlış gösteriyor. Yukarıdaki satır gibi görünmelidir (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.

Rekabetçi değil, çünkü sürüm 15 henüz yayınlanmadı.

Uygular fonksiyonu (⊢⊣⊃⎕NPUT⊢)üzerindeki 'A'1girişi (yani hiç) değiştirilene kadar:

⊢⊣⊃⎕NPUT⊢ bir fonksiyon treni:

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

En sağdaki döner 'A'1modifiye edilmemiş; bu (dosya adı, üzerine yazma bayrağı) `NPUT 'için doğru argüman olacaktır.

'⊃' 'A'1( 'A') öğesinin ilk öğesini döndürür ; Bu yazılacak veri.

Sonra ⎕NPUTçalıştırılır ve kaç bayt yazıldığını rapor eder (işletim sistemine bağlı olarak 2 veya 3); bu, doğru argüman haline gelir .

En soldaki yine 'A'1değiştirilmemiş olarak geri döner ; Bu sol argümanı .

sağ argümanını yok sayar ve sol argümanı ( 'A'1) döndürür , bu, beslenen yeni değer olur .

Yeni değer eskisi ile aynı olduğu için operasyon devam eder (sonsuza dek).



0

vim metin editörü, 10 bayt

qa:w<enter>@aq@a

Execution komutunu yapamadıysanız 8 bayt @a

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.