(Просто откройте 50 вкладок в Google Chrome: D (шучу, нет, вы не можете))
Кратчайший код для бесконечного дискового ввода-вывода любого языка, пример C #:
using System.IO;
namespace FileApp {
static class Program {
public static void Main() {
do {
File.WriteAllText("a", "a");
File.Delete("a");
} while (true);
}
}
}
Вы не можете просто заполнить весь диск, так как тогда он остановится в конце и будет конечным.
И вы не можете заниматься только чтением, должно произойти бесконечное написание. (Это должно убить мой SSD после достаточного времени выполнения.)
Взломать! :)
/dev/null
? (Являетсяyes>/dev/null
ли правильный ответ Bash?)Ответы:
DOS / Пакет: 4 байта
Этот пакетный файл будет вызывать себя (
%0
) и перенаправлять (>
) вывод в файл с именемx
. Так как эхо включено по умолчанию, это выведет путь и команду.источник
>
этим будет перезаписано.>>
добавил быPowerShell v2 +, 10 байт
Просто бесконечно петли с пустой
for
петлей. На каждой итерации мы выводим целое число1
(неявно преобразуемое в строку) с помощью>
оператора перенаправления , который перезаписывает файл с именем1
в локальном каталоге.источник
Winload.exe
достаточно ...1
должно быть некоторого числа, чтобы неявный синтаксический анализ работал правильно. Все от[0-9]
того же будет работать так же.1
чем-либо нечисловым (и не указанным ни как,.\a
ниa.txt
как) приводит к ошибке разбора.Pyth, 6 байт
Только команда выходного файла Pyth является
.w
. При вызове строки она записывает эту строку в файл в режиме добавления, что не подходит для целей этого вопроса. При вызове двумерного массива он записывает соответствующее изображение в этот файл, перезаписывая содержимое файла. Это то, что делает эта программа. По умолчанию выводится имя файлаo.png
, поэтому эта программа бесконечно перезаписывает файлo.png
1-пиксельным белым изображением.#
это бесконечный цикл.источник
Если вы хотите более короткий (но более скучный, чем мой) ответ:
Баш, 5 байт
Я мог бы сделать это короче, если есть команда (длиной менее 3 байтов), которая записывает что-то на дисковый ввод-вывод. Что-то вроде
sync
бы сработало, ноsync
стоит 4 байта 😛Примечание: это не работает, когда запускается прямо из bash, только когда вставляется в скрипт и запускается как имя скрипта. (то есть
echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb
)источник
exec
(или. $0
). Я думаю, что это закончится PID.w
Здесь нужно первое ? Для меня просто создайте>w
пустой файлw
, и выполнение этого в цикле создаст бесконечный ввод-вывод, потому что метаданные mtime необходимо постоянно обновлять.Рубин,
2220 байтНеоднократно усекает и записывает
1
в файлa
.Спасибо Ventero за 2 байта!
источник
open(?a,?w)<<1
сохранить 2 байта.cmd, 14 байтов
Бесконечно перезаписывает файл
1
со строкой в текущий каталогЯ новичок здесь: Windows новые строки (
CR
LF
) считаются как два байта?источник
LF
без проблем. Вышеуказанное работает для меня толькоLF
на Windows 8.1, поэтому ваши 14 байтов верны.CR
LF
2CR
1LF
1Bash + coreutils, 10
Записывает непрерывный поток
>b
, который передаетсяsh
для оценки.>b
просто обрезает файлb
с нулевым байтом каждый раз.источник
b
и нетc
?Perl 5,
273222 байтаЕсли достаточно просто изменить метку времени изменения файла ...
Быстрое объяснение:
Предыдущее решение (32 байта):
{{open my$h,'>o';print$h 1}redo}
Изменить:
{open F,'O';print F 1;redo}
← Не проверять код перед публикацией; теперь я должен был это исправить.источник
$
!PHP,
60 30 17 1615 байтОбновлен еще раз в соответствии с предложенным @manatwork:
Тоже сейчас проверено.
Немного обмана 22 байта:
while (exec ('> 1 dir'));Ранее предложение @manatwork 30 байтов:
в то время как (file_put_contents (1,1));НЕ ИСПЫТАНО (на этом компьютере нет php) 43 байта:
для ($ а = FOPEN (1, 'W'); fputs ($ а, 1); fclose ($ а))Оригинальные 45 байтов в гольфе:
$ А = Еореп (1, 'W'); при этом (fputs ($ а, 1)) перемотке ($ A);Мой первый пост здесь присоединился, потому что мне просто нужно было это опробовать: пока запись в файл будет успешной, перемотайте указатель файла, чтобы начать.
Просто не может быть меньше, чем file_put_contents ().источник
while(file_put_contents(1,1));
должно быть достаточно. Обратите внимание, что запуск полных сценариев из командной строкиphp -r '…'
является приемлемым в соответствии с консенсусом по мета Запуск PHP-r
вместо тегов кода .ш, 11 байт
Сохраните это в файл без специальных символов, таких как loop.sh, сделайте его исполняемым, и запустите его с
./loop.sh
или подобным.Это записывает вывод команды
w
в файлw
, каждый раз перезаписывая предыдущее значение. Затем он заменяет себя новой версией той же программы, поэтому он может работать бесконечно.источник
>
. Кроме того, предполагая, что у вас есть «особая»$PATH
и «специальная» umask / filesystem, вы можете пойти на этоw>>w;$0
, сократив ее до 7 символов>>
добавлен, он в конечном итоге заполнит диск. $0
вместоexec $0
, возможно? Я не знаю, будет ли это работать, вызывает переполнение стека или что-то, хотя. ... Да, это сегрегировано.C
959493897890897675 байтовОпять же,
sudo watch -n1 lsof -p `pidof inf`
кажется, говорит, что это действительно.КАК Я НЕ ВИДЕЛ, ЧТО ПРОСТРАНСТВО D: <
Спасибо @Jens за то, что сбрил 13 байтов: D
источник
w+
Режим чтения и записи, первоначально усечения файл. Поскольку вам не нужно читать, вы можете сбрить байт с помощью justw
, который также усекает файл, но не открывает файл в режиме чтения.return 0;
если цикл никогда не заканчивается.fputc(1,f)
вместо супер-многословныйfprintf(f," ")
?main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}
с пустым условным вfor
средствахtrue
. 76 байтов.Баш, 26 байт
Если бы я расширил эту строку, я бы получил это:
Это не может точно конкурировать с 10-байтовой линией PowerShell, но она будет противостоять другим. Смотрите мой другой ответ для 6-байтовой версии.
источник
while :;ls>l;done
exec
трюк будет лучшеls>l;exec $0
. Короче, но скучно.:>l;exec $0
- создание файла записывает inodey
,yes
все равно продолжите запись в тот же дескриптор файла, который у него был. Беги,lsof | grep yes
и ты должен увидеть что-то вроде/path/to/y (deleted)
. Это заполнит диск и потерпит неудачу.rm y
вы можете использовать>y
который будет обрезать существующий файл. Это также немного короче.TI-BASIC, 12 байтов
Альтернативное решение от пользователя lirtosiast с тем же размером:
Это будет работать на калькуляторах серии TI-83 + и TI-84 +.
Да, это также работает, если A уже заархивирован или вообще не инициализируется при запуске программы! Программа занимает всего 12 байтов из-за токенизации .
источник
CPython 3.5,
3316 байтДа, действительно. : D
источник
while 1:open("a","w")
короче иstrace
показывает, что python выполняет операции open, fstat64 и close, определенно операции ввода-вывода. Если файлa
уже существует, он может быть еще короче:while 1:open('a')
который все еще генерируетopen
,fstat64
иclose
, и даже изменяетatime
файл.MATL , 10 байт
объяснение
Это бесконечный цикл, который записывает число
1
в файл, вызываемыйinout
в текущем каталоге, перезаписывая содержимое предыдущего файла.источник
Haskell, 20 байтов
Запишите строку
"a"
в файл с именем"b"
и повторите.writeFile
перезаписывает файл, если он существует.источник
JavaScript (Node.js),
4341 байтЗаписывает
null
в файл с именемa
, затем повторите.источник
c
илиx
в файл? Сохраняет 2 байта. Кроме того, неrequire`fs`
работает?c
илиx
.require`fs`
к сожалению, не работает, потому что использование обратных галочек для вызова функции вызывает ее с первыми аргументами как["fs"]
(массив, первым и единственным элементом которого является переданная строка) вместо"fs"
(просто строка). Попробуйтеconsole.log`test`
например.ZSH, 14 байтов
Zsh, в отличие от Bash и других Bourne-подобных оболочек, допускает петли без
do ... done
ограждения , при условии, что условие соответствующим образом разграничено.В качестве альтернативы, с
while
:Обратите внимание, что
:
это встроенный. Вы не можете приостановить этот цикл.Принцип тот же, что и в ответе Digital Trauma - в файл ничего не записывается, IO - это просто создание и усечение файла.
источник
Ржавчина, 84 байта
File::create
обрезает существующий файл, таким образом гарантируя, что у нас не останется свободного места на диске.Используемый компилятор (1.9 Nightly) выдает предупреждение о неиспользованном результате,
write(...)
но тем не менее компилируется.источник
C 92 байта
Хотя, похоже, вы можете сэкономить 1 байт
проблема с этим циклом в том, что + не дает вам гарантированный заказ.
Или рекурсивный - не должен переполняться, если компилятор правильно реализует хвостовую рекурсию (f находится в явной внутренней области видимости)
85 байт
источник
for(;;)
, и для более коротких функций, чемfprintf
. Если вам нужно было включить stdio.h (чего у вас нет), вам не нужен пробел:#include<stdio.h>
Mathematica, 14 байтов
Повторно записывает строку
"a"
в файл с именемa
в текущем каталоге, создавая ее, если она не существует.источник
a
, которая не определена, поэтому он просто пишетa\n
.C, 40 байтов
Тем не менее, он быстро исчерпает файловые дескрипторы; это можно преодолеть с помощью:
45, 43 байтаисточник
int
.open()
не является константой времени компиляции). Кроме того, ему не хватит места на диске, потому что lseek нет. Может быть, попробуйтеutime("a","")
в цикле, который будет обновлятьctime
. (Вам все еще нужноopen
создать файл с известным именем).lazytime
, как я уже сказал в своем ответе.C в amd64 Linux, 36 байт (только временная метка),
5249 байт (реальная активность диска)Я жестко
open(2)
кодирую флаги, так что это не переносимо на другие ABI. Linux на других платформах, вероятно, использует то же самоеO_TRUNC
и т. Д., Но другие операционные системы POSIX не могут.+4 байта для передачи правильного аргумента разрешения, чтобы убедиться, что файл создан с правами записи владельца, см. Ниже. (Это работает с gcc 5.2)
несколько переносимый ANSI C, 38/51 байт (только временная метка), 52/67 байт (реальная активность диска)
Основано на ответе @ Cat с подсказкой @Jens.
Первое число для реализаций, где
int
может содержатьFILE *fopen()
возвращаемое значение, второе число, если мы не можем этого сделать. В Linux адреса кучи находятся в младших 32 битах адресного пространства, поэтому он работает даже без-m32
или-mx32
. (Объявлениеvoid*fopen();
короче чем#include <stdio.h>
)Только метаданные ввода-вывода метки времени :
Запись байта, фактически попадание на диск в Linux 4.2.0 + XFS +
lazytime
:write
это условие цикла for, которое хорошо, поскольку оно всегда возвращает 1.close
это приращение.Объяснение непереносимой версии:
Файл создан со случайными разрешениями мусора. С
gcc
5.2, с-O0
или-O3
, бывает, что есть разрешение владельца на запись, но это не гарантируется.0666
является десятичным 438. 3-й аргумент toopen
займет еще 4 байта . Мы уже жестко программируем O_TRUNC и так далее, но это может нарушить другой компилятор или libc на том же ABI.Мы не можем опустить 2-й аргумент в
open
, потому что значение мусора включает в себяO_EXCL
, иO_TRUNC|O_APPEND
, так что open не удается сEINVAL
.Нам не нужно сохранять возвращаемое значение из
open()
. Мы предполагаем это3
, потому что так будет всегда. Даже если мы начнем с открытия fd 3, он будет закрыт после первой итерации. В худшем случае,open
продолжает открывать новые fds до тех пор, пока 3 не станет последним доступным дескриптором файла. Таким образом, до первых 65531write()
вызовов может произойти сбойEBADF
, но затем он будет работать нормально при каждомopen
создании fd = 3.577 = 0x241 =
O_WRONLY|O_CREAT|O_TRUNC
в x86-64 Linux. БезO_TRUNC
этого время модификации и изменения inode не обновляются, поэтому более короткое значение arg невозможно.O_TRUNC
все еще важно для версии, которая вызываетwrite
фактическую активность диска, а не перезаписывает на месте.Я вижу некоторые ответы, которые
open("a",1)
. O_CREAT требуется, еслиa
еще не существует.O_CREAT
определяется как восьмеричное 0100 (64, 0x40) в Linux.Нет утечки ресурсов, поэтому он может работать вечно.
strace
выход:или же
Я получил десятичное значение
open
флагов для этого ABI, используемогоstrace -eraw=open
в моей версии C ++.В файловой системе с
lazytime
включенной опцией монтирования Linux изменение, затрагивающее только метки времени inode, будет вызывать только одну запись в сутки. Если эта опция монтирования отключена, обновление метки времени может стать жизнеспособным способом изнашивания вашего SSD. (Тем не менее, несколько других ответов делают только ввод / вывод метаданных).альтернативы:
короче нерабочий :
main(){for(;;)close(write(open("a",577),"",3));}
используетwrite
возвращаемое значение для передачи3
аргумента для закрытия. Он сохраняет другой байт, но не работает с gcc -O0 или -O3 на amd64. Мусор в 3-м аргументеopen
отличается и не включает разрешения на запись.a
создается в первый раз, но все будущие итерации терпят неудачу-EACCESS
.длиннее, работает, с разными системными вызовами :
main(c){for(open("a",65);pwrite(3,"",1);)sync();}
перезаписывает байт на месте и вызываетsync()
синхронизацию всех файловых систем в масштабе всей системы. Это поддерживает свет на диске.Нам не важно, какой байт, поэтому мы не передаем 4-й аргумент в pwrite. Yay для разреженных файлов:
Полагаю, что запись одного байта со смещением ~ 128 ТБ привела к тому, что xfs использовал пространство в 300 КБ для хранения карты экстентов. Не пытайтесь сделать это на OS X с HFS +: IIRC, HFS + не поддерживает разреженные файлы, поэтому он заполнит диск.
XFS - это правильная 64-битная файловая система, поддерживающая отдельные файлы до 8 эксабайт . т.е. 2 ^ 63-1, максимальное значение
off_t
может удерживаться.strace
выход:источник
Ракетка, 46 байт
источник
Фактор, 73 байта
Устанавливает содержимое файла в нулевой байт навсегда.
источник
CBM BASIC 7.0, 9 байтов
Эта программа при запуске многократно сохраняет себя на диск. Вот более читаемая версия, в которой не используются сокращения ключевых слов BASIC:
источник
0 SAVE "A" : RUN
Python, 32 байта
Обратите внимание, что при запуске на Python 3 это приведет к бесконечному количеству предупреждений. Кроме того, он, вероятно, исчерпает fds, если будет запущен в реализации без повторного подсчета.
источник
write
и"w"
части команды open.Dyalog APL 15,0, 17 байт (не конкурирует)
Chrome в настоящее время делает U + 2262 неправильным. Вышеуказанная строка должна выглядеть
(⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1
.Это не конкурирует, потому что версия 15 еще не была выпущена.
Относится
⍣
к функции(⊢⊣⊃⎕NPUT⊢)
на'A'1
до тех пор , пока вход изменяется (т.е. никогда):⊢⊣⊃⎕NPUT⊢
это функциональный поезд:Правый
⊢
возвращается'A'1
без изменений; this (имя файла, overwrite-flag) будет правильным аргументом для `PNPUT '.«⊃» возвращает первый элемент
'A'1
('A'
); это данные для записи.затем
⎕NPUT
запускается и сообщает, сколько байтов было записано (2 или 3 в зависимости от ОС); это становится правильным аргументом⊣
.Крайний левый
⊢
снова возвращается'A'1
без изменений; это левый аргумент⊢
.⊣
игнорирует свой правый аргумент и возвращает левый аргумент ('A'1
), это становится новым значением, переданным⍣
.Поскольку новое значение идентично старому, операция продолжается (навсегда).
источник
SmileBASIC, 12 байт
источник
текстовый редактор vim, 10 байт
8 байт, если вы не можете выполнить команду
@a
источник