Código mais curto para E / S de disco infinito
(Basta abrir 50 guias no Google Chrome: D (brincadeira, não, você não pode))
Código mais curto para E / S de disco infinita em qualquer idioma, exemplo em C #:
Você não pode simplesmente encher o disco inteiro, pois ele acabaria no final e seria finito.
E você não pode ler apenas, a escrita infinita precisa acontecer. (Ele precisa matar meu SSD após tempo de execução suficiente.)
Será que ler arquivos em vez de escrevê-las também contam como disco I / O? Que tal escrever para /dev/null? (É yes>/dev/nulluma resposta Bash válido?)
Pode receber alguma entrada?
Caramba ... o que seu SSD fez com você?
Como não posso esperar competir com soluções de 6 bytes, a criação do arquivo ./a com o conteúdo de 3 bytes ./ contaria um prêmio de bônus pelo pensamento lateral? AFAIK apenas a execução de um arquivo faz com que alguns sistema de arquivos escrevendo a ter lugar em muitos sistemas, porque pelo menos a hora do último acesso 'é atualizado como um subproduto ;-)
Muitas dessas respostas gravam os dados no mesmo espaço repetidamente. Isso não resulta em uma gravação de disco real, mesmo que os dados sejam diferentes. (Caso extremo, dos -.> Comunicações janelas eu escrevi 4k de dados dos e lê-lo de volta no Windows - desde que os dados foram fluindo da luz do disco iria ficar fora.)
DOS / lote: 4 bytes
Esse arquivo em lote se chamará ( %0) e redirecionará ( >) a saída para um arquivo chamado x. Como o eco está ativado por padrão, isso produzirá o caminho e o comando.
Eventualmente, isso ficará sem espaço em disco ou a saída será substituída?
@MathuSumMut: Com >ele será substituído. >>acrescentaria
Você ganha, então eu acho: P
@ ΈρικΚωνσταντόπουλος: Isso é verdade. Nesse caso, um arquivo com 0 byte é produzido, não gerando E / S conforme esperado por esse desafio. Mas não é nossa tarefa de considerar todos os casos, caso contrário, você pode querer desativar o cache, scanners de vírus, ...
A gravação de um arquivo de 0 byte ainda causará a E / S do disco, pois ele precisa atualizar a hora da última modificação no diretório.
PowerShell v2 +, 10 bytes
Basta fazer um loop infinito com um forloop vazio . A cada iteração, produzimos o número inteiro 1(convertido implicitamente em uma string) com o > operador redirecionar , que substitui o arquivo nomeado 1no diretório local.
Você poderia substituir o segundo 1 por qualquer outra coisa (que cria um nome de arquivo válido) ou precisa ser 1?
No meu Windows VM, Winload.exeé suficiente ...
Eu acho que tem que ser um número, porque se for uma letra, ela seria tratada como uma variável, para tratá-la como uma string, são necessárias aspas e desperdiçam bytes. : P
@QPaysTaxes MathuSum está correto. O segundo 1precisa ser um tipo de número para que a análise implícita funcione corretamente. Qualquer coisa [0-9]funcionaria da mesma maneira.
@ Nacht Talvez seja uma peculiaridade do meu ambiente particular, então. No meu ISE (PSv4 Win8.1), substituir o segundo 1por qualquer coisa não numérica (e não especificada como .\aou a.txtsemelhante) resulta em um erro de análise.
Pitão, 6 bytes
O único comando de saída de arquivos de Pyth é .w. Quando chamada em uma string, ela grava essa string em um arquivo no modo de acréscimo, o que não é bom para o propósito desta pergunta. Quando chamado em uma matriz 2-d, ele grava a imagem correspondente nesse arquivo, substituindo o conteúdo do arquivo. É isso que este programa faz. O nome padrão da saída do arquivo é o.png, portanto, este programa substitui infinitamente o arquivo o.pngcom uma imagem branca de 1 pixel. #é um loop infinito.
Se você quer uma resposta mais curta (mas mais chata do que a minha outra):
Eu poderia tornar isso mais curto se houver um comando (com menos de 3 bytes) que grave algo na E / S do disco. Algo como syncfuncionaria, mas synctem 4 bytes 😛
Nota: isso não funciona quando executado diretamente do bash, apenas quando colocado em um script e executado como o nome do script. (ie echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)
Parece que é um empate entre mim e @isaacg - quem ganha?
Eu prefiro usar exec(ou . $0). Eu acho que isso ficará sem PIDs.
O primeiro é wnecessário aqui? Para mim, basta >wcriar um arquivo vazio w, e fazer isso em um loop criará E / S infinita porque os metadados do mtime precisam ser atualizados continuamente.
Se que qualifica @HenningMakholm então eu vou colocá-lo.
O script contém apenas esses bytes. Desde que é bash, não há compilador ou qualquer coisa sofisticada necessária.
Trunca e grava repetidamente um 1no arquivo a.
Obrigado ao Ventero por 2 bytes!
open(?a,?w)<<1para salvar 2 bytes.
Obrigado, maçaneta, por nos honrar com sua presença. Estou humilhado.
Isso vaza descritores de arquivo? Ou ele é fechado quando sai do escopo? (IDK Ruby, desculpe).
Substitui infinitamente o arquivo 1com a sequência no diretório atual
Eu sou novo aqui: as novas linhas do Windows ( CR LF) são contadas como dois bytes?
Bem-vindo ao PPCG! O Windows, pelo menos sistemas modernos, deve ser capaz de lidar LFsem problemas. O procedimento acima funciona para mim apenas LFno Windows 8.1, portanto seus 14 bytes estão corretos.
CR LF2 CR1 LF1
Grava um fluxo contínuo de >b, o qual é canalizado shpara avaliação. >bsimplesmente trunca um arquivo chamado bpara zero bytes a cada vez.
+1 porque seu nome é realmente apropriado para que esse trecho de código vai fazer
Por que be não c?
Se simplesmente alterar o registro de data e hora da modificação de um arquivo for suficiente ...
Solução anterior (32 bytes): {{open my$h,'>o';print$h 1}redo}
Edit: {open F,'O';print F 1;redo} ← Não testou o código antes de postar; agora eu tinha que corrigi-lo.
: oa variável perl não prefixada com $!
@cat: Não é uma variável regular, como escalar, matriz ou hash. É simplesmente uma palavra de baralho. Dependendo do contexto, uma palavra de barra pode ser interpretada como uma sub (função), uma glob, eu acho, ou um arquivo. (Talvez outros também?)
Atualizado mais uma vez de acordo com o @manatwork sugerido:
Também agora testado.
Um pouco de trapaça 22 bytes:
while (exec ('> 1 dir'));
Sugestão anterior de @manatwork 30 bytes:
while (file_put_contents (1,1));
NÃO TESTADO (nenhum php disponível neste computador) 43 bytes:
for ($ a = fopen (1, 'w'); fputs ($ a, 1); fclose ($ a))
Um original com 45 bytes de golfe:
$ a = fopen (1, 'w'); while (fputs ($ a, 1)) retrocede ($ a);
Meu primeiro post aqui entrou porque eu só tinha que tentar isso: contanto que a gravação do arquivo seja bem-sucedida, rebobine o ponteiro do arquivo para iniciar.
Só não pode ficar menor que o file_put_contents ().
while(file_put_contents(1,1));deve ser suficiente. Note-se que a execução de scripts completos de linha de comando como php -r '…'é aceitável como por consenso sobre meta Correndo PHP com -rem vez de tags de código .
— Manatwork 01/04
Isso está realmente gravando no disco ou apenas um buffer na memória?
— Brice M. Dempsey
@manatwork Oh cara! Eu sabia que sempre havia espaço para melhorias, mas isso ... muito ruim essa função não tem nome mais curto. : DI não sei sobre o buffer .. Gostaria de saber se devo atualizar a resposta com essa solução mais curta.
Se for mais curto, atualize sua resposta, vá em frente! :)
— MathuSum Mut 01/04
É permitido chamar exec () do php? Eu percebo que não está mais no "escopo" do php.
Salve isso em um arquivo sem caracteres especiais, como loop.sh, torne-o executável e execute-o com ./loop.shou similar.
Isso grava a saída do comando wno arquivo w, substituindo o valor anterior a cada vez. Em seguida, ele se substitui por uma nova versão do mesmo programa, para que possa ser executado infinitamente.
isso está faltando um segundo >. Além disso, supondo que você tem um "especial" $PATHe "especial" umask / sistema de arquivos, você pode ir para w>>w;$0, salga-lo até 7 caracteres
@mnagel >>é de acréscimo, ele acabará por encher o disco
@ mnagel, mas você está certo sobre não precisar de exec, eu não percebi isso. Alguém fez isso, então eu não vou atualização, embora
Ou em . $0vez de exec $0, talvez? Não sei se isso será executado, causando um estouro de pilha ou algo assim. ... Sim, ele falhou.
Mais uma vez, sudo watch -n1 lsof -p `pidof inf`parece dizer que isso é válido.
COMO EU NÃO VI ESSE ESPAÇO D: <
Obrigado @ Jens por cortar 13 bytes: D
O w+modo é leitura e gravação, inicialmente truncando o arquivo. Como você não precisa ler, você pode cortar um byte com just w, que também trunca o arquivo, mas não abre o arquivo no modo de leitura.
Não é necessário return 0;se o loop nunca terminar.
Por que não usar em fputc(1,f)vez do super verboso fprintf(f," ")?
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}desde que um condicional vazio em formédias true. 76 bytes.
@PeterCordes PPCG não é Stack Overflow; não faça edições nas respostas de outras pessoas que alterem o código ou outras partes importantes da resposta. Correções de erros de digitação são boas, mas qualquer coisa além disso (incluindo correções de declarações factualmente incorretas) deve ser sugerida nos comentários.
Se eu expandisse essa linha única, obteria o seguinte:
Isso não pode competir exatamente com a linha PowerShell de 10 bytes, mas se manterá contra os outros. Veja minha outra resposta para a versão de 6 bytes.
while :;ls>l;done
O bom e velho exectruque vai fazer melhor: ls>l;exec $0. Mais curto, mas chato.
:>l;exec $0- Criação de arquivo está escrevendo o inode
Mesmo que você exclua y, yescontinuará a gravar no mesmo identificador de arquivo que possuía. Corra lsof | grep yese você verá algo como /path/to/y (deleted). Isso irá encher o disco e falhar.
Em vez de rm yvocê pode usar o >yque truncará o arquivo existente. Também é um pouco mais curto.
Solução alternativa pelo usuário lirtosiast com o mesmo tamanho:
Isso funcionará nas calculadoras TI-83 + e TI-84 +.
Sim, isso também funciona se A já estiver arquivado ou não for inicializado no início do programa! O programa tem apenas 12 bytes devido à tokenização .
— Jamy Mahabier
Não sei se a memória flash usada pelas calculadoras conta como "disco".
@lirtosiast defesa de De Jamy, os SSDs são feitos de memória flash =)
De qualquer forma, a contagem de bytes é pelo menos 10 bytes a menos. A tela 2nd Mem conta com um cabeçalho igual a 9 bytes + o comprimento do nome do programa, mas não o fazemos aqui para que você possa subtraí-lo.
@lirtosiast Isso grava e lê repetidamente na ROM (memória permanente) da calculadora, não na RAM. Claro, calculadoras não têm um interior rígido real :)
@lirtosiast Obrigado, eu não sabia disso! (Fiquei me perguntando por que a quantidade de bytes que minha TI-84 + relatou não corresponde à minha contagem de mãos ...) Atualizei minha resposta.
— Jamy Mahabier 04/04
Sim com certeza. : D
while 1:open("a","w")é mais curto e stracemostra que o python está executando operações open, fstat64 e close, definitivamente de E / S. Se o arquivo ajá existir, ele poderá ser ainda mais curto: o while 1:open('a')que ainda gera um open, fstat64e close, e até modifica atimeo arquivo.
@ RadovanGarabík: 0 Obrigado, eu não conhecia essa informação útil! Obviamente, é uma implementação específica.
Este é um loop infinito que grava número 1 em um arquivo chamado inoutno diretório atual, substituindo o conteúdo do arquivo anterior.
Escreva a string "a"em um arquivo nomeado "b"e repita. writeFilesobrescreve o arquivo, se existir.
Grava nullem um arquivo chamado ae repita.
E quanto a escrever cou xno arquivo? Salva 2 bytes. Além disso, não require`fs`funciona?
— 7776 Charlie
@ Charlie Bom ponto com a escrita cou x. require`fs`infelizmente não funciona, porque o uso de backticks para chamar uma função a chama com os primeiros argumentos como ["fs"](array, que primeiro e único elemento é a string passada) em vez de "fs"(apenas a string). Tente console.log`test`por exemplo.
O Zsh, diferentemente do Bash e de outras conchas do tipo Bourne, permite loops sem a do ... donecerca , desde que a condição seja adequadamente delimitada.
Alternativamente, com while:
Observe que :é um builtin. Você não pode suspender esse loop.
O princípio é o mesmo da resposta do Digital Trauma - nada é gravado no arquivo, o IO é apenas para criar e truncar o arquivo.
Devo dizer que nunca pensei que veria muru, o muru, vindo jogar Code Golf. Bem-vindo ao PPCG: D
@cat Obrigado. : DI já jogou uma vez antes.
Ferrugem, 84 bytes
File::create trunca um arquivo existente, garantindo assim que o espaço em disco não fique vazio.
O compilador usado (1.9 Nightly) emite um aviso sobre o resultado não utilizado, write(...)mas compila mesmo assim.
Embora pareça que você poderia economizar 1 byte
o problema com esse loop é que + não fornece a ordem garantida.
Ou recursivo - não deve estourar se o compilador implementar corretamente a recursão de cauda (f está em um escopo interno explícito)
Esperamos que a versão de 85 bytes não destrua a pilha. : P
@MathuSumMut: correção fácil: requer compilação com otimizações. A recursão da chamada de cauda salva o dia.
Há muito espaço para salvar bytes aqui. Veja minha resposta para empacotar coisas dentro do for(;;)e para funções mais curtas que fprintf. Se você precisava incluir stdio.h (o que não é o seu caso), não precisa de um espaço:#include<stdio.h>
Grava repetidamente a string "a"em um arquivo nomeado ano diretório atual, criando-o se não existir.
ele escreveria a string "a" ou o conteúdo da variável a? E se este último, o que faria se essa variável ainda não estivesse definida?
@ MichaelStern Ele escreve a variável a, que é indefinida, então apenas escreve a\n.
Porém, ele rapidamente ficará sem descritores de arquivo; isso pode ser superado com:
45 , 43 bytes
Por que f não tem um tipo no segundo?
@cat Em C (estilo K&R), o padrão é int.
— Edmz 3/04
O gcc e o clang não compilarão a segunda versão. Mesmo o GNU C não permite a inicialização dinâmica de uma variável estática / global (uma chamada para open()não é uma constante em tempo de compilação). Além disso, ficará sem espaço em disco, porque não há lseek. Talvez tente utime("a","")no loop, que continuará atualizando o arquivo ctime. (Você ainda precisa opencriar um arquivo com nome conhecido).
@ PeterCordes Você está certo, obrigado por apontar. Fixo.
— Edmz 15/05
Ainda não satisfaz a exigência do OP de não encher o disco eventualmente, mas talvez ainda valha a pena ser mantido como resposta. (A menos que você tenha uma idéia melhor do que a minha resposta seja fechada / reaberta (O_TRUNC) em um loop.) Ao contrário do meu comentário anterior, atualizar carimbos de data / hora normalmente geralmente não produz E / S de disco real no Linux. Como talvez uma gravação por 24 horas lazytime, como eu disse na minha resposta.
C no amd64 Linux, 36 bytes (somente timestamp), 52 49 bytes (atividade em disco real)
Eu open(2)codifico os sinalizadores, portanto, isso não é portátil para outras ABIs. O Linux em outras plataformas provavelmente usa o mesmo O_TRUNC, etc., mas outros sistemas operacionais POSIX podem não.
+4 bytes para passar um argumento de permissão correto para garantir que o arquivo seja criado com acesso de gravação do proprietário, veja abaixo. (Isso funciona com o gcc 5.2)
ANSI C um tanto portátil, 38/51 bytes (somente carimbo de data / hora), 52/67 bytes (atividade em disco real)
Com base na resposta de @ Cat, com uma dica de @Jens.
O primeiro número é para implementações em que um intpode reter FILE *fopen()o valor de retorno, o segundo número, se não pudermos fazer isso. No Linux, os endereços de heap estão com pouco espaço de endereço de 32 bits; portanto, ele funciona mesmo sem -m32ou -mx32. (A declaração void*fopen();é menor que #include <stdio.h>)
Somente E / S de metadados de carimbo de data e hora :
Escrevendo um byte, atingindo o disco no Linux 4.2.0 + XFS + lazytime:
writeé a condição do loop for, o que é bom, pois sempre retorna 1. closeé o incremento.
Explicação da versão não portátil:
O arquivo é criado com permissões aleatórias de lixo. Com o gcc5.2, com -O0ou -O3, inclui permissão de gravação do proprietário, mas isso não é garantido. 0666é decimal 438. Um terceiro argumento openlevaria outros 4 bytes . Nós já estamos codificando O_TRUNC e assim por diante, mas isso pode ocorrer com um compilador ou libc diferente na mesma ABI.
Não podemos omitir o segundo argumento para open, porque o valor do lixo inclui O_EXCL, e O_TRUNC|O_APPEND, portanto, a abertura falha com EINVAL.
Não precisamos salvar o valor de retorno open(). Nós assumimos que é 3, porque sempre será. Mesmo se começarmos com o fd 3 aberto, ele será fechado após a primeira iteração. Na pior das hipóteses, opencontinua abrindo novos fds até que 3 seja o último descritor de arquivo disponível. Portanto, até as primeiras 65531 write()chamadas podem falhar EBADF, mas funcionarão normalmente com toda a opencriação de fd = 3.
577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCno x86-64 Linux. Sem O_TRUNC, o tempo de modificação do inode e o tempo de alteração não são atualizados, portanto, um argumento mais curto não é possível. O_TRUNCainda é essencial para a versão que chama writepara produzir a atividade real do disco, não para reescrever no local.
Eu vejo algumas respostas isso open("a",1). O_CREAT é necessário se aainda não existir. O_CREATé definido como octal 0100 (64, 0x40) no Linux.
Nenhum vazamento de recursos, portanto, ele pode ser executado para sempre. straceresultado:
Eu tenho o valor decimal dos opensinalizadores para este ABI usando strace -eraw=openna minha versão C ++.
Em um sistema de arquivos com a lazytimeopção de montagem Linux ativada, uma alteração que afeta apenas os carimbos de data / hora do inode causará apenas uma gravação a cada 24 horas. Com essa opção de montagem desativada, a atualização do carimbo de data / hora pode ser uma maneira viável de desgastar seu SSD. (No entanto, várias outras respostas fazem apenas E / S de metadados).
menos tempo de trabalho :
main(){for(;;)close(write(open("a",577),"",3));}usa writeo valor de retorno para passar um 3argumento para fechar. Ele salva outro byte, mas não funciona com o gcc -O0 ou -O3 no amd64. O lixo no terceiro argumento para opené diferente e não inclui permissão de gravação. aé criado na primeira vez, mas todas as iterações futuras falham -EACCESS.
por mais tempo, trabalhando, com diferentes chamadas do sistema :
main(c){for(open("a",65);pwrite(3,"",1);)sync();} reescreve um byte no local e chama sync()para sincronizar todos os sistemas de arquivos em todo o sistema. Isso mantém a luz da unidade acesa.
Nós não nos importamos com qual byte, então não passamos o quarto argumento para escrever. Yay para arquivos esparsos:
Escrever um byte em um deslocamento de ~ 128TiB levou ao xfs usando 300kiB de espaço para armazenar o mapa de extensão, eu acho. Não tente fazer isso no OS X com o HFS +: IIRC, o HFS + não suporta arquivos esparsos; portanto, ele preencherá o disco.
O XFS é um sistema de arquivos adequado de 64 bits, suportando arquivos individuais de até 8 exabytes . ou seja, 2 ^ 63-1, o valor máximo off_tpode ser mantido.
strace resultado:
Raquete, 46 bytes
Eu estava pensando em responder em Racket, mas você me venceu. : P
Por curiosidade, você encontrou uma resposta mais curta?
Fator, 73 bytes
Define o conteúdo do arquivo para o byte nul para sempre.
Este programa, quando executado, se salva repetidamente em disco. Aqui está uma versão mais legível que não usa abreviações de palavras-chave BASIC:
No entanto, fica sem fita cassete? ;)
— MathuSum Mut 04/04
@MathuSumMut que seria0 SAVE "A" : RUN
— ceilingcat 25/02
Observe que, se executado no python 3, isso produzirá um número infinito de avisos. Além disso, provavelmente ficará sem fds se for executado em uma implementação sem refcounting.
Apenas como observação, existe uma resposta mais curta sem writea "w"parte e do comando open.
Dyalog APL 15.0, 17 bytes (não concorrente)
Atualmente, o Chrome processa U + 2262 errado. A linha acima deve parecer (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.
Isso não é concorrente porque a versão 15 ainda não foi lançada.
Aplica-se ⍣a função (⊢⊣⊃⎕NPUT⊢)em 'A'1até que a entrada é alterado (ou seja, nunca):
⊢⊣⊃⎕NPUT⊢ é um trem de função:
O mais à direita ⊢ retorna sem 'A'1modificação; este (nome do arquivo, sinalizador de substituição) será o argumento correto para `PNPUT '.
'⊃' retorna o primeiro elemento de 'A'1('A' ); esses são os dados a serem gravados.
Em seguida, ⎕NPUTé executado e relata quantos bytes foram gravados (2 ou 3, dependendo do SO); este se torna o argumento certo para o⊣ .
O mais à esquerda ⊢novamente retorna sem 'A'1modificação; este é o argumento da esquerda para o⊢ .
⊣ignora seu argumento da direita e retorna o argumento da esquerda ( 'A'1), esse se torna o novo valor alimentado para⍣ .