Kode terpendek untuk disk I / O yang tak terbatas


49

(Cukup buka 50 tab di Google Chrome: D (hanya bercanda, tidak Anda tidak bisa))

Kode terpendek untuk disk I / O tak terbatas bahasa apa pun, C # contoh:

using System.IO;

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

Anda tidak bisa hanya mengisi seluruh disk, karena pada akhirnya akan berhenti dan akan terbatas.

Dan Anda tidak bisa hanya membaca, tulisan yang tak terbatas harus terjadi. (Ini harus membunuh SSD saya setelah runtime yang cukup.)

Dapatkan retak! :)


6
Apakah membaca file alih-alih menulisnya juga dianggap sebagai disk I / O? Bagaimana dengan menulis /dev/null? (Apakah yes>/dev/nulljawaban Bash yang valid?)
Gagang pintu

2
Bisakah itu mengambil input?
Pengguna112638726

29
Sobat, apa yang SSD Anda lakukan kepada Anda?
R. Kap

2
Karena saya tidak bisa berharap untuk bersaing dengan solusi 6 byte, akankah membuat file ./a dengan konten 3 byte ./a dihitung sebagai hadiah bonus untuk berpikir lateral? AFAIK hanya mengeksekusi file menyebabkan beberapa penulisan sistem file terjadi pada banyak sistem, karena paling tidak 'waktu akses terakhir' diperbarui sebagai produk sampingan ;-)
Stilez

3
Banyak dari jawaban ini akan menulis data ke ruang yang sama berulang kali. Itu tidak menghasilkan menulis disk yang sebenarnya bahkan jika data berbeda. (Extreme case, dos -> windows communications. Saya menulis 4k data dalam dos dan membacanya kembali di Windows - selama data mengalir, lampu disk akan tetap mati.)
Loren Pechtel

Jawaban:


26

DOS / Batch: 4 byte

%0>x

File batch ini akan memanggil dirinya sendiri ( %0) dan mengarahkan ulang ( >) output ke file yang disebut x. Karena gema aktif secara default, ini akan menampilkan path dan perintah.


Apakah ini akan kehabisan ruang disk pada akhirnya, atau output ditimpa?
MathuSum Mut

1
@MathuSumMut: Dengan >itu akan ditimpa. >>akan menambahkan
Thomas Weller

1
Anda menang maka saya kira: P
MathuSum Mut

2
@ ΈρικΚωνσταντόπουλος: Itu benar. Dalam hal ini, file dengan 0 byte diproduksi, tidak menghasilkan I / O seperti yang diharapkan oleh tantangan ini. Tapi itu bukan tugas kami untuk mempertimbangkan setiap kasus, jika tidak, Anda mungkin ingin mematikan caching, pemindai virus, ...
Thomas Weller

1
Menulis file 0 byte masih akan menyebabkan disk I / O, karena harus memperbarui waktu yang terakhir diubah dalam direktori.

48

PowerShell v2 +, 10 byte

for(){1>1}

Cukup loop tanpa batas dengan forloop kosong . Setiap iterasi, kami mengeluarkan integer 1(secara implisit dikonversi menjadi string) dengan > operator pengalihan , yang menimpa file yang disebutkan 1dalam direktori lokal.


Bisakah Anda mengganti 1 kedua dengan yang lain (yang membuat nama file yang valid) atau harus 1?
Nic Hartley

1
Pada Windows VM saya, Winload.exesudah cukup ...
Comintern

Saya pikir itu harus berupa angka karena jika itu adalah huruf maka itu akan diperlakukan sebagai variabel, untuk memperlakukannya sebagai kutipan string diperlukan, dan mereka membuang byte. : P
MathuSum Mut

1
@QPaysTaxes MathuSum sudah benar. Yang kedua 1perlu sejumlah semacam agar parsing implisit untuk bekerja dengan benar. Apa pun dari [0-9]akan bekerja sama.
AdmBorkBork

1
@Nacht Mungkin itu kekhasan lingkungan khusus saya. Dalam ISE saya (PSv4 Win8.1), mengganti yang kedua 1dengan sesuatu yang non-numerik (dan tidak ditentukan sebagai .\aatau a.txtatau sejenisnya) menghasilkan kesalahan parse.
AdmBorkBork

28

Pyth, 6 byte

#.w]]0

Perintah keluaran file hanya Pyth adalah .w. Ketika dipanggil pada string, string itu dituliskan ke file dalam mode append, yang tidak baik untuk keperluan pertanyaan ini. Ketika dipanggil pada array 2-d, itu menulis gambar yang sesuai untuk file itu, menimpa isi file. Itulah yang dilakukan oleh program ini. Nama output file default adalah o.png, jadi program ini secara tak terbatas menimpa file o.pngdengan gambar putih 1-pixel. #adalah loop tak terbatas.


27

Jika Anda ingin jawaban yang lebih pendek (tapi lebih membosankan daripada yang lain):

Bash, 5 byte

>w;$0

Saya bisa membuatnya lebih pendek jika ada perintah (kurang dari 3 byte panjang) yang menulis sesuatu ke disk I / O. Sesuatu seperti syncakan berfungsi, tetapi sync4 byte 😛

Catatan: ini tidak berfungsi saat dijalankan langsung dari bash, hanya ketika dimasukkan ke dalam skrip dan dijalankan sebagai nama skrip. (yaitu echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)


1
Sepertinya ini adalah ikatan antara saya dan @isaacg - siapa yang menang?
Daniel

8
Saya lebih suka menggunakan exec(atau . $0). Saya pikir ini akan kehabisan PID.
muru

1
Apakah yang pertama wdibutuhkan di sini? Bagi saya cukup >wmembuat file kosong w, dan melakukan itu dalam satu lingkaran akan membuat I / O yang tak terbatas karena metadata mtime perlu diperbarui terus menerus.
Henning Makholm

1
Jika itu memenuhi syarat @HenningMakholm maka saya akan memasukkannya.
Daniel

2
Script hanya berisi byte ini. Karena itu bash tidak ada kompiler atau barang mewah yang dibutuhkan.
Daniel

16

Ruby, 22 20 byte

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

Berulang kali memotong dan menulis 1ke file a.

Terima kasih kepada Ventero untuk 2 byte!


3
open(?a,?w)<<1untuk menyimpan 2 byte.
Ventero

Terima kasih, kenop pintu, untuk menghormati kami dengan kehadiran Anda. Saya merasa rendah hati.
MathuSum Mut

Apakah itu deskriptor file bocor? Atau apakah itu ditutup ketika keluar dari ruang lingkup? (IDK Ruby, maaf).
Peter Cordes

13

cmd, 14 byte

:a
cd>1
goto a

Infinitly menimpa file 1dengan string ke direktori saat ini


Saya baru di sini: Apakah baris baru windows ( CR LF) dihitung sebagai dua byte?


13
Selamat datang di PPCG! Windows, setidaknya sistem modern, harus dapat menangani LFtanpa masalah. Di atas berfungsi untuk saya hanya dengan LFWindows 8.1, jadi 14 byte Anda sudah benar.
AdmBorkBork

CR LF2 CR1 LF1
Erik the Outgolfer

13

Bash + coreutils, 10

yes \>b|sh

Menulis aliran berkelanjutan >b, yang disalurkan ke shuntuk evaluasi. >bcukup memotong file yang dipanggil bke nol byte setiap kali.


4
+1 karena nama Anda benar-benar sesuai dengan yang akan dilakukan cuplikan kode ini
Olivier Dulac

Kenapa bdan tidak c?
CalculatorFeline

9

Perl 5, 27 32 22 byte

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

Jika hanya mengubah stempel waktu modifikasi file sudah cukup ...

Penjelasan cepat:

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

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

Sunting: {open F,'O';print F 1;redo} ← Tidak menguji kode sebelum memposting; sekarang saya harus memperbaikinya.


1
: oa variabel perl tidak diawali dengan $!
kucing

@ kucing: Ini bukan variabel biasa, seperti skalar, array, atau hash. Ini hanyalah sebuah kata pengantar. Tergantung pada konteksnya, sebuah kata kunci dapat diambil sebagai sub (fungsi), gumpalan, saya pikir, atau filehandle. (Mungkin yang lain juga?)
g4v3

8

PHP, 60 30 17 16 15 byte

Diperbarui lagi seperti yang disarankan @manatwork:

while(!`cd>1`);

Juga sekarang diuji.


Sedikit kecurangan 22 byte:

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

Saran sebelumnya oleh @manatwork 30 byte:

while (file_put_contents (1,1));

TIDAK DIUJI (tidak tersedia php di komputer ini) 43 byte:

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

Asli 45 byte golf:

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

Posting pertama saya di sini, bergabung karena saya hanya harus mencoba ini: selama file berhasil ditulis, mundur file pointer untuk memulai.


Hanya tidak bisa lebih kecil dari file_put_contents ().


5
while(file_put_contents(1,1));Seharusnya cukup. Perhatikan bahwa menjalankan skrip penuh dari baris perintah sebagaimana php -r '…'dapat diterima sesuai konsensus tentang meta Menjalankan PHP dengan -rbukannya tag kode .
manatwork

Apakah ini benar-benar menulis ke disk atau hanya buffer di memori?
Brice M. Dempsey

1
@manatwork Ya ampun! Saya tahu selalu ada ruang untuk perbaikan, tapi itu ... sayangnya fungsi itu tidak punya nama pendek. : Saya tidak tahu tentang buffer .. Saya ingin tahu apakah saya harus memperbarui jawabannya dengan solusi yang lebih pendek.
diynevala

2
Jika lebih pendek, silakan perbarui jawaban Anda, silakan! :)
MathuSum Mut

Apakah diizinkan untuk memanggil exec () dari php? Saya menyadari itu tidak ada lagi di "lingkup" php.
diynevala

7

sh, 11 byte

w>w;exec $0

Simpan ini ke file tanpa karakter khusus, seperti loop.sh, buat itu dapat dieksekusi, dan jalankan dengan ./loop.shatau serupa.

Ini menulis output dari perintah wke file w, menimpa nilai sebelumnya setiap kali. Kemudian, ia mengganti dirinya sendiri dengan versi baru dari program yang sama, sehingga dapat berjalan tanpa batas.


ini hilang sebentar >. juga, dengan asumsi Anda memiliki $PATHsistem file / w>>w;$0
files

@mnagel >>ditambahkan, ia akhirnya akan mengisi disk
cat

1
@ mnagel tetapi Anda benar tentang tidak perlu eksekutif, saya tidak menyadarinya. Orang lain telah melakukannya, jadi saya tidak akan memperbarui,
isaacg

3
Atau . $0bukannya exec $0, mungkin? Saya tidak tahu apakah itu akan berjalan menyebabkan stack overflow atau sesuatu. ... Yap, segfaulted.
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));}   

Sekali lagi, sudo watch -n1 lsof -p `pidof inf`sepertinya mengatakan ini valid.

BAGAIMANA SAYA TIDAK MELIHAT RUANG YANG D: <

Terima kasih @Jens untuk mencukur 13 byte: D


1
The w+mode membaca dan menulis, awalnya truncating file. Karena Anda tidak perlu membaca, Anda dapat mengurangi byte hanya dengan w, yang juga memotong file, tetapi tidak membuka file dalam mode baca.
Mego

1
Tidak perlu return 0;jika loop tidak pernah berakhir.
Jens

1
Mengapa tidak menggunakan fputc(1,f)bukan super-verbose fprintf(f," ")?
Jens

1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}karena kondisional kosong forberarti true. 76 byte
Jens

1
@PeterCordes PPCG bukan Stack Overflow; tolong jangan mengedit jawaban orang lain yang mengubah kode atau bagian utama jawaban lainnya. Perbaikan kesalahan ketik baik-baik saja, tetapi apa pun yang (termasuk koreksi dari pernyataan yang salah secara faktual) harus disarankan dalam komentar.
kucing

6

Bash, 26 byte

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

Jika saya ingin memperluas one-liner ini, saya akan mendapatkannya:

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

Ini tidak bisa benar-benar bersaing dengan garis PowerShell 10 byte, tetapi akan bertahan sendiri terhadap yang lain. Lihat jawaban saya yang lain untuk versi 6 byte.


2
while :;ls>l;done
User112638726

1
The tua yang baik exectrik akan melakukan yang lebih baik: ls>l;exec $0. Lebih pendek, tapi membosankan.
manatwork

:>l;exec $0- pembuatan file sedang menulis inode
user24582

7
Meskipun Anda menghapus y, yesmasih akan terus menulis ke pegangan file yang sama dengan yang dimilikinya. Jalankan lsof | grep yesdan Anda akan melihat sesuatu seperti /path/to/y (deleted). Ini akan mengisi disk dan gagal.
muru

4
Alih-alih rm yAnda dapat menggunakan >yyang akan memotong file yang ada. Ini juga sedikit lebih pendek.
aragaer

6

TI-BASIC, 12 byte

While 1
Archive A
UnArchive A
End

Solusi alternatif oleh pengguna lirtosiast dengan ukuran yang sama:

While 1
SetUpEditor
Archive ∟1
End

Ini akan bekerja pada seri kalkulator TI-83+ dan TI-84+.

Ya, ini juga berfungsi jika A sudah diarsipkan atau tidak diinisialisasi sama sekali pada awal program! Program ini hanya 12 byte karena tokenization .


Saya tidak tahu apakah memori flash yang digunakan oleh kalkulator dianggap sebagai "disk".
lirtosiast

1
@ lirtosiast Dalam pertahanan Jamy, SSD terbuat dari memori flash =)
Cort Ammon

Bagaimanapun, jumlah byte paling sedikit 10 byte lebih sedikit. Layar Mem 2 menghitung header sama dengan 9 byte + panjang nama program, tapi kami tidak di sini sehingga Anda dapat mengurangi itu.
lirtosiast

@ lirtosiast Berulang kali ini menulis dan membaca ROM (memori permanen) kalkulator, bukan RAM. Tentu saja, kalkulator tidak memiliki hard drive yang sebenarnya di dalam :)
Jamy Mahabier

@ lirtosiast Terima kasih, saya tidak tahu tentang itu! (Saya bertanya-tanya mengapa jumlah byte yang dilaporkan TI-84 + saya tidak cocok dengan perhitungan saya ...) Saya telah memperbarui jawaban saya.
Jamy Mahabier

6

CPython 3.5, 33 16 byte

while 1:open("a")

Ya benar : D


while 1:open("a","w")lebih pendek dan stracemenunjukkan bahwa python melakukan open, fstat64 dan close, pasti operasi I / O. Jika file asudah ada, bahkan bisa lebih pendek: while 1:open('a')yang masih menghasilkan open, fstat64dan close, dan bahkan memodifikasi atimefile.
Radovan Garabík

@ RadovanGarabík: 0 Terima kasih, saya tidak tahu informasi yang berguna itu! Tentu saja, ini implementasi spesifik.
kucing

5

MATL , 10 byte

`1[]T3$Z#T

Penjelasan

Ini adalah loop tak terbatas yang menulis nomor 1 ke file yang disebut inoutdi direktori saat ini, menimpa konten file sebelumnya.

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

Tulis string "a"ke file bernama "b"dan ulangi. writeFilemenimpa file jika ada.


4

JavaScript (Node.js), 43 41 byte

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

Menulis nullke file bernama a, lalu ulangi.


1
Bagaimana dengan menulis catau xke file? Menghemat 2 byte. Juga, tidak require`fs`berhasil?
Charlie

1
@Charlie Poin bagus dengan tulisan catau x. require`fs`sayangnya tidak berfungsi, karena menggunakan backticks untuk memanggil fungsi memanggilnya dengan argumen pertama sebagai ["fs"](array, yang elemen pertama dan satu-satunya adalah string yang diteruskan) alih-alih "fs"(hanya string). Coba console.log`test`misalnya.
Michał Perłakowski

4

ZSH, 14 byte

for ((;;)) :>:

Zsh, tidak seperti Bash dan cangkang mirip Bourne lainnya, memungkinkan loop tanpa do ... donepagar , asalkan kondisinya sesuai dibatasi.

Atau, dengan while:

while {} {:>:}

Perhatikan bahwa itu :adalah builtin. Anda tidak dapat menangguhkan loop ini.

Prinsipnya sama dengan jawaban Digital Trauma - tidak ada yang tertulis pada file, IO murni dari membuat dan memotong file.


Saya harus mengatakan, saya tidak pernah berpikir saya akan melihat Muru, yang Muru, datang bermain Kode Golf. Selamat datang di PPCG: D
cat

1
@cat Terima kasih. : DI telah bermain sekali sebelumnya.
muru

3

Rust, 84 Bytes

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

File::create memotong file yang sudah ada, sehingga memastikan bahwa kami tidak kehabisan ruang disk.

Compiler yang digunakan (1.9 Nightly) mengeluarkan peringatan tentang hasil yang tidak digunakan dari write(...)tetapi mengkompilasi.


3

C, 92 byte

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

Meskipun sepertinya Anda bisa menghemat 1 byte

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

masalah dengan loop itu adalah + tidak memberi Anda pesanan yang dijamin.

Atau rekursif - tidak boleh meluap jika kompiler dengan benar mengimplementasikan rekursi ekor (f berada dalam lingkup bagian dalam yang eksplisit)

85 byte

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

Mudah-mudahan versi 85-byte tidak meniup stack. : P
MathuSum Mut

2
@MathuSumMut: Perbaikan mudah: membutuhkan kompilasi dengan optimisasi. Rekursi panggilan ekor menghemat hari.
Joshua

1
Ada banyak ruang untuk menyimpan byte di sini. Lihat jawaban saya untuk mengemas barang di dalam for(;;), dan untuk fungsi yang lebih pendek dari fprintf. Jika Anda memang perlu memasukkan stdio.h (yang tidak Anda miliki), Anda tidak perlu spasi:#include<stdio.h>
Peter Cordes

3

Mathematica, 14 byte

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

Berulang kali menulis string "a"ke file yang bernama adi direktori saat ini, membuatnya jika tidak ada.


apakah akan menulis string "a" atau isi dari variabel a? Dan jika yang terakhir, apa yang akan dilakukan jika variabel itu belum didefinisikan?
Michael Stern

@MichaelStern Ia menulis variabel a, yang tidak terdefinisi, jadi ia hanya menulis a\n.
LegionMammal978

3

C, 40 byte

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

Akan dengan cepat kehabisan deskriptor file; ini dapat diatasi dengan:

45 , 43 byte

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

Mengapa f tidak memiliki tipe dalam yang kedua?
kucing

2
@cat In C (sangat gaya K&R) defaultnya adalah int.
edmz

1
gcc dan dentang tidak akan mengkompilasi versi ke-2. Bahkan GNU C tidak mengizinkan inisialisasi dinamis dari variabel statis / global (panggilan ke open()bukan konstanta waktu kompilasi). Juga, itu akan kehabisan ruang disk, karena tidak ada lseek. Mungkin coba utime("a","")di loop, yang akan terus memperbarui ctime. (Anda masih harus openmembuat file dengan nama yang dikenal).
Peter Cordes

@PeterCordes Anda benar, terima kasih telah menunjukkan. Tetap.
edmz

Masih tidak memenuhi persyaratan OP untuk tidak mengisi disk pada akhirnya, tapi mungkin masih layak disimpan sebagai jawaban. (Kecuali jika Anda memiliki ide yang lebih baik daripada tutup / buka kembali jawaban saya (O_TRUNC) dalam satu lingkaran.) Berlawanan dengan komentar saya sebelumnya, memperbarui cap waktu biasanya tidak benar-benar menghasilkan I / O disk aktual di Linux. Seperti mungkin satu menulis per 24 jam dengan lazytime, seperti yang saya katakan dalam jawaban saya.
Peter Cordes

3

C pada amd64 Linux, 36 byte (hanya timestamp), 52 49 byte (aktivitas disk nyata)

Saya membuat kode yang sulit pada open(2)flag, jadi ini tidak portabel untuk ABI lain. Linux pada platform lain kemungkinan menggunakan hal yang sama O_TRUNC, dll., Tetapi OS POSIX lain mungkin tidak.

+4 byte untuk memberikan arg izin yang benar untuk memastikan file dibuat dengan akses tulis pemilik, lihat di bawah. (Ini terjadi untuk bekerja dengan gcc 5.2)

ANSI C agak portabel, 38/51 byte (hanya cap waktu), 52/67 byte (aktivitas disk nyata)

Berdasarkan jawaban @ Cat, dengan tip dari @Jens.

Angka pertama adalah untuk implementasi di mana suatu intdapat menyimpan FILE *fopen()nilai kembali, nomor kedua jika kita tidak bisa melakukan itu. Di Linux, tumpukan alamat kebetulan berada di ruang alamat 32 bit yang rendah, sehingga bisa berfungsi bahkan tanpa -m32atau -mx32. (Mendeklarasikan void*fopen();lebih pendek dari #include <stdio.h>)


Hanya metadata I / O stempel waktu :

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

Menulis byte, sebenarnya memukul disk di Linux 4.2.0 + XFS + lazytime:

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

writeadalah kondisi for-loop, yang baik-baik saja karena selalu mengembalikan 1. closeadalah kenaikan.

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

Penjelasan dari versi non-portabel:

File dibuat dengan izin sampah acak. Dengan gcc5.2, dengan -O0atau -O3, itu terjadi untuk menyertakan izin menulis pemilik, tetapi ini tidak dijamin. 0666adalah desimal 438. Arg ke-3 openakan membutuhkan 4 byte lagi . Kami sudah mengkodekan O_TRUNC dan seterusnya, tetapi ini bisa terputus dengan kompiler atau libc yang berbeda pada ABI yang sama.

Kita tidak dapat menghilangkan argumen ke-2 open, karena nilai sampah kebetulan termasuk O_EXCL, dan O_TRUNC|O_APPEND, jadi gagal gagal EINVAL.


Kami tidak perlu menyimpan nilai pengembalian dari open(). Kami berasumsi itu 3, karena akan selalu begitu. Bahkan jika kita mulai dengan fd 3 terbuka, itu akan ditutup setelah iterasi pertama. Kasing terburuk, openterus membuka fds baru hingga 3 adalah deskriptor file terakhir yang tersedia. Jadi, hingga 65531 write()panggilan pertama bisa gagal EBADF, tetapi kemudian akan bekerja secara normal dengan setiap openpembuatan fd = 3.

577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCdi x86-64 Linux. Tanpa O_TRUNC, waktu mod inode dan waktu perubahan tidak diperbarui, jadi arg yang lebih pendek tidak mungkin. O_TRUNCmasih penting untuk versi yang memanggil writeuntuk menghasilkan aktivitas disk yang sebenarnya, bukan menulis ulang di tempat.

Saya melihat beberapa jawaban itu open("a",1). O_CREAT diperlukan jika abelum ada. O_CREATdidefinisikan sebagai oktal 0100 (64, 0x40) di Linux.


Tidak ada sumber daya bocor, sehingga bisa berjalan selamanya. stracekeluaran:

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

atau

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

Saya mendapat nilai desimal dari openflag untuk ABI ini menggunakan strace -eraw=openversi C ++ saya.

Pada sistem file dengan lazytimeopsi pemasangan Linux diaktifkan, perubahan yang hanya memengaruhi cap waktu inode hanya akan menyebabkan satu penulisan per 24 jam. Dengan opsi pemasangan yang dinonaktifkan, pemutakhiran stempel waktu mungkin merupakan cara yang layak untuk memakai SSD Anda. (Namun, beberapa jawaban lain hanya melakukan metadata I / O).


alternatif:

lebih pendek tidak bekerja :

main(){for(;;)close(write(open("a",577),"",3));}menggunakan writenilai balik untuk melewatkan 3arg untuk menutup. Ini menyimpan byte lain, tetapi tidak bekerja dengan gcc -O0 atau -O3 pada amd64. Sampah di arg ke-3 openberbeda, dan tidak termasuk izin menulis. aakan dibuat pertama kali, tetapi iterasi di masa mendatang semuanya gagal -EACCESS.

lebih lama, bekerja, dengan panggilan sistem yang berbeda :

main(c){for(open("a",65);pwrite(3,"",1);)sync();} menulis ulang byte di tempat dan panggilan sync() untuk menyinkronkan semua sistem file di seluruh sistem. Ini membuat lampu drive menyala.

Kami tidak peduli byte mana, jadi kami tidak meneruskan argumen ke 4 ke pwrite. Yay untuk file jarang:

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

Menulis satu byte pada offset ~ 128TiB menyebabkan xfs menggunakan 300kiB ruang untuk menampung peta sebatas, saya kira. Jangan coba ini di OS X dengan HFS +: IIRC, HFS + tidak mendukung file jarang, sehingga akan mengisi disk.

XFS adalah sistem file 64bit yang tepat, mendukung masing-masing file hingga 8 exabytes . yaitu 2 ^ 63-1, nilai maksimum off_tdapat disimpan.

strace keluaran:

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

Racket, 46 byte

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

1
Saya berpikir untuk menjawab di Racket, tetapi Anda mengalahkan saya untuk itu. : P
cat

Karena penasaran, apakah Anda menemukan jawaban yang lebih pendek?
Winny

1

Faktor, 73 byte

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

Menyetel konten file ke byte nul selamanya.


1

CBM BASIC 7.0, 9 byte

0dS"a":rU

Program ini, ketika dijalankan, berulang kali menyimpan dirinya ke disk. Berikut adalah versi yang lebih mudah dibaca yang tidak menggunakan singkatan kata kunci BASIC:

0 dsave "a" : run

1
Apakah ini kehabisan kaset? ;)
MathuSum Mut

1
@MathuSumMut itu akan menjadi0 SAVE "A" : RUN
ceilingcat

1

Python, 32 byte

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

Perhatikan bahwa jika dijalankan pada python 3, ini akan menghasilkan jumlah peringatan yang tak terbatas. Juga, mungkin akan kehabisan fds jika dijalankan dalam implementasi non-penghitungan ulang.


Sama seperti catatan, jawaban yang lebih pendek ada tanpa writedan "w"bagian dari perintah terbuka.
Rɪᴋᴇʀ

1

Dyalog APL 15.0, 17 byte (tidak bersaing)

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

Chrome saat ini membuat U + 2262 salah. Baris di atas akan terlihat seperti (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.

Ini tidak bersaing karena versi 15 belum dirilis.

Berlaku fungsi (⊢⊣⊃⎕NPUT⊢)pada 'A'1sampai input berubah (yaitu tidak pernah):

⊢⊣⊃⎕NPUT⊢ adalah kereta fungsi:

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

Paling kanan kembali 'A'1dimodifikasi; ini (nama file, timpa-bendera) akan menjadi argumen yang tepat untuk `PNPUT '.

'⊃' mengembalikan elemen pertama dari 'A'1( 'A'); ini adalah data yang akan ditulis.

Kemudian ⎕NPUTdijalankan, dan melaporkan berapa byte yang ditulis (2 atau 3 tergantung pada OS); ini menjadi argumen yang tepat untuk .

Yang paling kiri kembali 'A'1tidak dimodifikasi; ini adalah argumen kiri ke .

mengabaikan argumen kanannya dan mengembalikan argumen kiri ( 'A'1), ini menjadi nilai baru yang diumpankan ke .

Karena nilai baru identik dengan yang lama, operasi dilanjutkan (selamanya).



0

editor teks vim, 10 byte

qa:w<enter>@aq@a

8 byte jika Anda tidak bisa menjalankan perintah @a

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.