无限磁盘I / O的最短代码


49

(只需在Google Chrome:D中打开50个标签(开个玩笑,不,您不能))

无限磁盘I / O任何语言的最短代码,C#示例:

using System.IO;

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

但是,您不能只填满整个磁盘,因为磁盘最终将停止并且是有限的。

而且你不能只阅读,无限写作必定会发生。(它必须在足够的运行时间后杀死我的SSD。)

破解!:)


6
文件,而不是写他们也算磁盘I / O的?那写信/dev/null呢?(yes>/dev/null有效的Bash答案吗?)
门把手

2
可以接受任何输入吗?
User112638726 '16

29
man子...您的SSD对您做了什么?
R. Kap

2
由于我不希望与6字节的解决方案竞争,因此创建具有3字节内容..a的文件./a会获得横向思考的额外奖励吗?AFAIK只是执行文件会导致在许多系统上进行某些文件系统写入,因为至少“最后访问时间”作为副产品被更新了;-)
Stilez 2016年

3
这些答案中的许多答案都会一遍又一遍地将数据写入同一空间。即使数据不同,也不会导致实际的磁盘写入。(极端情况下,dos-> Windows通讯。我在dos中写入了4k数据,然后在Windows中读回了它-只要数据流了,磁盘的光就会熄灭。)
Loren Pechtel

Answers:


26

DOS /批处理:4个字节

%0>x

此批处理文件将调用自身(%0)并将>输出重定向()到名为的文件x。由于echo默认为打开状态,因此将输出路径和命令。


这会最终耗尽磁盘空间,还是输出被覆盖?
MathuSum Mut

1
@MathuSumMut:>它将被覆盖。>>将追加
托马斯·韦勒

1
你赢了,然后我猜:P
MathuSum Mut

2
@ΈρικΚωωσταντόπουλος:是的。在这种情况下,将生成一个具有0字节的文件,而不产生此挑战所期望的I / O。但这不是我们要考虑的所有情况的任务,否则您可能想要关闭缓存,病毒扫描程序……
Thomas Weller

1
写入0字节的文件仍然会导致磁盘I / O,因为它必须更新目录中的最后修改时间。

48

PowerShell v2 +,10个字节

for(){1>1}

只需使用空循环无限for循环即可。每次迭代时,我们1使用> redirect操作符输出整数(隐式转换为字符串),该操作符将覆盖1本地目录中命名的文件。


您可以将第二个1替换为其他任何文件(生成有效的文件名),还是必须将其替换为1?
Nic Hartley

1
在我的Windows VM上Winload.exe就足够了……
Comintern

我认为它必须是数字,因为如果是字母,则将其视为变量,将其视为字符串引号是必需的,并且它们浪费字节。:P
MathuSum Mut

1
@QPaysTaxes MathuSum正确无误。1为了使隐式解析正常工作,第二个必须是某种形式的数字。一切[0-9]都一样。
AdmBorkBork '16

1
@Nacht也许那是我特定环境的怪癖。在我的ISE(PSv4 Win8.1)中,将第二个替换为1任何非数字(且未指定为.\aa.txt类似名称)会导致解析错误。
AdmBorkBork '16

28

Pyth,6个字节

#.w]]0

Pyth的唯一文件输出命令是.w。当在字符串上调用时,它将以附加模式将该字符串写入文件中,对于此问题而言,这样做没有好处。在二维数组上调用时,它将相应的图像写入该文件,从而覆盖文件内容。这就是程序的作用。默认文件输出名称为o.png,因此此程序将o.png使用1像素的白色图像无限覆盖该文件。#是一个无限循环。


27

如果您想要一个更短(但比其他人更无聊)的答案:

Bash,5个字节

>w;$0

如果有一个将某些内容写到磁盘I / O的命令(少于3个字节),我可以将其缩短。类似的东西sync可以工作,但是sync是4个字节😛

注意:仅从bash直接运行时,此功能不起作用,仅当放入脚本并以脚本名称运行时才有效。(即echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb


1
看来这是我和@isaacg之间的纽带-谁赢了?
丹尼尔(Daniel)

8
我更喜欢使用exec(或. $0)。我认为这将用完PID。
muru

1
w这里是第一个需要吗?对我来说,只需>w创建一个空文件w,然后在循环中执行此操作将创建无限的I / O,因为mtime元数据需要不断更新。
Henning Makholm

1
如果那符合@HenningMakholm的条件,那么我将其放入。–
Daniel

2
该脚本仅包含这些字节。因为它是bash,所以不需要编译器或任何花哨的东西。
丹尼尔(Daniel)

16

Ruby,22个 20字节

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

反复截断并将a写入1文件a

感谢Ventero提供2个字节!


3
open(?a,?w)<<1保存2个字节。
Ventero '16

感谢您,doorknob,感谢您的光临。我很谦虚
MathuSum Mut

那会泄漏文件描述符吗?还是超出范围会关闭?(IDK Ruby,对不起)。
彼得·科德斯

13

cmd,14个字节

:a
cd>1
goto a

无限地1使用字符串将文件覆盖到当前目录


我在这里是新手:Windows新行(CR LF)是否算作两个字节?


13
欢迎来到PPCG!Windows,至少是现代系统,应该能够LF毫无问题地处理。上面的内容仅LF在Windows 8.1上对我有用,因此您的14个字节是正确的。
AdmBorkBork '16


13

Bash + coreutils,10

yes \>b|sh

写入的连续流>b,通过管道将其传输以sh进行评估。 每次都>b将一个被称为b零字节的文件截断。


4
+1是因为您的名字确实适合此代码段的
用途

为什么bc呢?
CalculatorFeline

9

Perl 5中,27个 32 22字节

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

如果仅更改文件的修改时间戳就足够了...

快速说明:

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

先前的解决方案(32字节): {{open my$h,'>o';print$h 1}redo}

编辑: {open F,'O';print F 1;redo} ←在发布之前没有测试代码;现在我必须纠正它。


1
:oa perl变量不带$

@cat:它不是常规变量,例如标量,数组或哈希。这只是一个空话。根据上下文的不同,我认为裸字可以作为子(函数),全局变量或文件句柄。(也许还有其他人吗?)
g4v3 '16

8

PHP,60 30 17 16 15字节

根据@manatwork建议再次更新:

while(!`cd>1`);

现在也经过测试。


作弊的22个字节:

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

@manatwork先前的建议30字节:

while(file_put_contents(1,1));

未测试(此计算机上没有php)43个字节:

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

打高尔夫球的原始45个字节:

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

我在这里的第一篇文章之所以加入,是因为我只需要尝试一下:只要文件写入成功,就倒带文件指针以开始。


只是不能小于file_put_contents()。


5
while(file_put_contents(1,1));应该足够了。请注意,php -r '…'按照meta 运行PHP -r而不是代码标记的共识,可以从命令行运行完整脚本。
manatwork '16

这实际上是写入磁盘还是只是内存中的缓冲区?
布里斯·登普西

1
@manatwork噢,伙计!我知道总是有改进的余地,但是有太多...太糟糕了,该功能没有更短的名称。:DI不知道缓冲区..我想知道是否应该用较短的解决方案更新答案。
diynevala '16

2
如果更短,请更新您的答案,继续!:)
MathuSum Mut

是否可以从php调用exec()?我意识到在php的“作用域”中不再存在。
diynevala '16

7

sh,11个字节

w>w;exec $0

将此文件保存到没有特殊字符(例如loop.sh)的文件中,使其可执行并使用./loop.sh或类似名称运行。

这会将命令的输出写入w文件w,每次都覆盖先前的值。然后,它将自己替换为同一程序的全新版本,因此它可以无限运行。


这错过了一秒钟>。同样,假设您有一个“特殊” $PATH和“特殊” umask /文件系统,则可以将w>>w;$0其限制为7个字符
mnagel '16

@mnagel >>是追加,最终会填满磁盘

1
@mnagel,但是您不需要执行程序是正确的,我没有意识到。别人做了,所以我不会更新
isaacg '16

3
还是. $0代替exec $0?我不知道这是否会导致堆栈溢出或其他原因。...是的,它已断断续续。
muru

7

C,95 94 93 89 78 90 89 76 75字节

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

再次,sudo watch -n1 lsof -p `pidof inf`似乎在说这是有效的。

我怎么看不到空格D:<

感谢@Jens削减了13个字节:D


1
w+模式为读写模式,最初会截断文件。由于不需要读取,因此可以使用just删除一个字节w,这也会截断文件,但不会在读取模式下打开文件。
Mego

1
return 0;如果循环永远不会终止,则不需要。
詹斯

1
为什么不使用fputc(1,f)代替超级冗长fprintf(f," ")
詹斯

1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}因为在一个空的条件for的手段true。76个字节
詹斯

1
@PeterCordes PPCG不是堆栈溢出;请不要对他人的答案进行修改,否则会更改代码或答案的其他主要部分。修正错字是可以的,但是在注释中建议不要做任何改动(包括对事实不正确的陈述的更正)。

6

Bash,26个字节

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

如果我要扩展这种单线,我会得到:

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

这不能与10字节的PowerShell行完全竞争,但是它将与其他行保持竞争。看到我的其他答案的6字节版本。


2
while :;ls>l;done
User112638726

1
好老exec把戏会做的更好:ls>l;exec $0。较短,但很无聊。
manatwork '16

:>l;exec $0-文件创建正在写入
索引

7
即使您删除yyes仍将继续写入与之相同的文件句柄。运行lsof | grep yes,您应该会看到类似的信息/path/to/y (deleted)。这将填满磁盘并失败。
muru

4
而不是rm y您可以使用>y它将截断现有文件。它也短一些。
aragaer '16

6

TI-BASIC,12个字节

While 1
Archive A
UnArchive A
End

用户lirtosiast的替代解决方案,其大小相同:

While 1
SetUpEditor
Archive ∟1
End

这将适用于TI-83 +和TI-84 +系列计算器。

是的,如果A已经被归档或在程序启动时根本没有初始化,那么这也适用!由于标记化,该程序只有12个字节


我不知道计算器使用的闪存是否算作“磁盘”。
lirtosiast '16

1
@lirtosiast在Jamy的辩护中,SSD由闪存制成=)
Cort Ammon

在任何情况下,字节数至少要少10个字节。“第二内存”屏幕计数的标头等于9个字节+程序名称的长度,但是我们不在这里,因此您可以将其减去。
lirtosiast '16

@lirtosiast这将反复写入和读取计算器的ROM(永久存储器),而不是RAM。当然,计算器内部没有实际的硬盘驱动器:)
Jamy Mahabier '16

@lirtosiast谢谢,我对此一无所知!(我想知道为什么我的TI-84 +报告的字节数与我的手计数不匹配...)我已经更新了答案。
Jamy Mahabier '16

6

CPython的3.5,33 16个字节

while 1:open("a")

对真的。:D


while 1:open("a","w")更短,strace表明python正在执行open,fstat64和close,绝对是I / O操作。如果文件a已经存在,则可以更短:while 1:open('a')它仍会生成openfstat64close,甚至会修改atime文件。
RadovanGarabík'16

@RadovanGarabík:0谢谢,我不知道那条方便的信息!当然,它是特定于实现的。

5

MATL,10字节

`1[]T3$Z#T

说明

这是一个无限循环,它将数字写入当前目录中1 的文件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个字节

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

将字符串写入"a"名为的文件"b"并重复。writeFile覆盖该文件(如果存在)。


4

JavaScript(Node.js),43个 41字节

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

写入null名为的文件a,然后重复。


1
写入c或写入x文件呢?节省2个字节。另外,require`fs`行不通吗?
查理

1
@Charlie擅长写作cxrequire`fs`不幸的是,这是行不通的,因为使用反引号来调用函数时,将第一个参数作为["fs"](数组,第一个也是唯一的元素是传递的字符串)而不是"fs"(只是字符串)来调用。尝试console.log`test`例如。
米哈尔Perłakowski

4

ZSH,14个字节

for ((;;)) :>:

与Bash和其他类似Bourne的外壳不同,Zsh允许循环而没有do ... done围栏,条件是适当地定界。

或者,使用while

while {} {:>:}

请注意,这:是内置的。您无法暂停此循环。

其原理与Digital Trauma的答案相同 -不会向文件写入任何内容,IO完全来自于创建和截断文件。


我得说,我从没想过我会见到一位木匠,这位木匠来打Code Golf。欢迎来到PPCG:D

1
@cat谢谢。:DI之前玩过一次。
muru

3

锈,84字节

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

File::create 截断现有文件,从而确保我们不会用完磁盘空间。

使用过的编译器(1.9 Nightly)发出关于的未使用结果的警告,write(...)但仍会编译。


3

C,92个字节

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

虽然看起来您可以节省1个字节

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

该循环的问题在于+不能给您保证的顺序。

还是递归-如果编译器正确实现了尾递归,则不应溢出(f在显式的内部范围内)

85字节

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

希望85字节的版本不会破坏堆栈。:P
MathuSum Mut

2
@MathuSumMut:轻松解决:需要进行优化编译。尾调用递归可以节省一天的时间。
约书亚

1
在这里保存字节有很多范围。请参阅我的答案,以将内容包装在内for(;;),并且功能比短fprintf。如果确实需要包括stdio.h(不需要),则不需要空格:#include<stdio.h>
Peter Cordes

3

Mathematica,14个字节

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

重复将字符串写入当前目录中"a"命名的文件a,如果不存在则创建它。


它会写字符串“ a”还是变量a的内容?如果是后者,如果尚未定义该变量怎么办?
迈克尔·斯特恩

@MichaelStern它写入a未定义的变量,因此只写入a\n
LegionMammal978

3

C,40个字节

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

但是,它将很快用完文件描述符。这可以通过以下方法克服:

45,43个字节

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

f为什么第二个没有类型?

2
@cat在C(非常K&R样式)中,默认为int
edmz '16

1
gcc和clang无法编译第二版本。甚至GNU C也不允许动态初始化静态/全局变量(对的调用open()不是编译时常量)。另外,由于没有lseek,它将耗尽磁盘空间。也许utime("a","")在循环中尝试一下,它将不断更新ctime。(您仍然必须open创建一个已知名称的文件)。
彼得·科德斯

@PeterCordes你是对的,谢谢你指出。固定。
edmz '16

仍然不能满足OP最终不填满磁盘的要求,但也许仍然值得回答。(除非您有一个比循环中答案的close / reopen(O_TRUNC)更好的主意。)与我之前的评论相反,仅在Linux上更新时间戳通常不会真正产生实际的磁盘I / O。就像lazytime我在回答中所说的那样,每24小时写一次。
彼得·科德斯

3

在amd64 Linux上为C,36字节(仅时间戳),52 49字节(实际磁盘活动)

我对这些open(2)标志进行了硬编码,因此它不能移植到其他ABI。其他平台上的Linux可能使用相同的O_TRUNC,等等,但其他POSIX操作系统则可能不使用。

+4个字节可传递正确的权限arg,以确保该文件具有所有者写访问权限,请参见下文。(这恰好适用于gcc 5.2)

稍微可移植的ANSI C,38/51字节(仅时间戳),52/67字节(实际磁盘活动)

基于@Cat的答案,并附有@Jens的提示。

第一个数字用于其中int可以保存FILE *fopen()返回值的实现,第二个数字用于无法实现的返回值。在Linux上,堆地址恰好在地址空间的低32位中,因此即使没有-m32或也可以使用堆地址-mx32。(声明void*fopen();比短#include <stdio.h>


仅时间戳元数据I / O

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

写一个字节,实际上是在Linux 4.2.0 + XFS +上打磁盘lazytime

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

write是for循环条件,因为它总是返回1.,所以很好 close

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

非便携式版本的说明:

该文件是使用随机垃圾回收权限创建的。在gcc5.2中,使用-O0或时-O3,恰好包含所有者的写许可权,但这不能保证。 0666是小数点438。 第3个arg要open占用另外4个字节。我们已经在硬编码O_TRUNC,依此类推,但是在同一ABI上使用其他编译器或libc可能会中断此操作。

我们不能忽略第二个arg open,因为垃圾值恰好包含了O_EXCLO_TRUNC|O_APPEND,所以打开失败EINVAL


我们不需要保存来自的返回值open()。我们假设它是3,因为它永远是。即使我们从打开fd 3开始,也将在第一次迭代后将其关闭。最坏的情况是,open不断打开新的fds,直到3是最后一个可用的文件描述符。因此,最多前65531个write()调用可能会因失败EBADF,但随后在每次open创建fd = 3时都能正常工作。

O_WRONLY|O_CREAT|O_TRUNC在x86-64 Linux上为577 = 0x241 = 。如果不使用O_TRUNC,则不会更新inode的mod时间和更改时间,因此不可能使用更短的arg。 O_TRUNC对于调用write以产生实际磁盘活动而不是就地重写的版本而言,它仍然是必不可少的。

我看到一些答案open("a",1)。如果a还不存在,则需要O_CREAT 。 O_CREAT在Linux上定义为八进制0100(64,0x40)。


没有资源泄漏,因此它可以永远运行。 strace输出:

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

要么

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

我在C ++版本上open使用了此ABI 的标志的十进制值strace -eraw=open

lazytime启用了Linux 挂载选项的文件系统上,仅影响inode时间戳的更改只会导致每24小时写入一次。在禁用该安装选项的情况下,时间戳更新可能是磨损SSD的可行方法。(但是,其他几个答案仅适用于元数据I / O)。


备择方案:

较短的不工作时间

main(){for(;;)close(write(open("a",577),"",3));}使用write的返回值传递3arg来关闭。它保存了另一个字节,但不适用于amd64上的gcc -O0或-O3。第三个arg中的垃圾open是不同的,并且不包含写许可权。 a第一次创建,但以后的迭代都失败了-EACCESS

更长,可以使用不同的系统调用

main(c){for(open("a",65);pwrite(3,"",1);)sync();} 就地重写一个字节,并调用sync()以在系统范围内同步所有文件系统。这样可以使驱动器指示灯保持点亮状态。

我们不在乎哪个字节,因此我们不会将第4个arg传递给pwrite。是的,对于稀疏文件:

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

我猜想,以〜128TiB的偏移量写入一个字节会导致xfs使用300kiB的空间来保存范围图。不要在具有HFS +的OS X上尝试此操作:IIRC,HFS +不支持稀疏文件,因此它将填充磁盘。

XFS是一个适当的64位文件系统,最多支持8艾字节的单个文件。即2 ^ 63-1,最大值off_t可以保持。

strace 输出:

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

球拍,46个字节

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

1
我当时想在球拍中回答,但您击败了我。:P

出于好奇,您是否找到了一个简短的答案?
Winny

1

因子,73字节

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

将文件内容永久设置为nul字节。


1

CBM BASIC 7.0,9个字节

0dS"a":rU

该程序在运行时会反复将自身保存到磁盘。这是一个更具可读性的版本,不使用BASIC关键字缩写:

0 dsave "a" : run

1
磁带是否用完了?;)
MathuSum Mut

1
@MathuSumMut将会是0 SAVE "A" : RUN
ceilingcat '17

1

Python,32个字节

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

请注意,如果在python 3上运行,这将产生无限数量的警告。同样,如果在非引用实现中运行,它可能会用完fds。


只是要注意,没有open命令的write"w"部分,存在一个较短的答案。
Rɪᴋᴇʀ

1

Dyalog APL 15.0,17字节(非竞争)

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

Chrome当前导致U + 2262错误。上面的行应该看起来像(⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1

这是非竞争性的,因为版本15尚未发布。

应用功能(⊢⊣⊃⎕NPUT⊢)'A'1,直至输入电压变化(即从不):

⊢⊣⊃⎕NPUT⊢ 是功能火车:

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

最右边的返回'A'1未修改;这个(文件名,overwrite-flag)将是“⎕NPUT”的正确参数。

'⊃'返回'A'1'A')的第一个元素;这是要写入的数据。

然后⎕NPUT运行,并报告写入了多少字节(2或3个字节,取决于操作系统);这成为正确的论点

最左边再次返回'A'1未修改;这是的左参数

忽略其右参数并返回左参数('A'1),这将成为馈给的新值

由于新值与旧值相同,因此将继续操作(永远)。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.