무한 디스크 I / O를위한 가장 짧은 코드


49

(Chrome에서 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 답변입니까?)
Doorknob

2
입력이 가능합니까?
112638726

29
Dang man ... SSD는 어떤 역할을 했습니까?
R. Kap

2
6 바이트 솔루션과 경쟁하고 싶지 않기 때문에 3 바이트 내용으로 ./a 파일을 만들거나 측면 사고에 대한 상을받을 수 있습니까? AFAIK 단지 파일을 원인 실행 일부 때문에 최소한 '마지막 액세스 시간'에 많은 시스템에 자리를 차지할 작성 파일 시스템은 ;-) 부산물로 업데이트됩니다
Stilez

3
이러한 답변 중 많은 부분이 데이터를 동일한 공간에 반복해서 쓸 것입니다. 데이터가 다르더라도 실제 디스크 쓰기는 발생하지 않습니다. (극단적 인 경우, dos-> windows communication. 나는 데이터로 4k의 데이터를 쓰고 Windows에서 다시 읽습니다. 데이터가 흐르고있는 한 디스크 라이트는 꺼져 있습니다.)
Loren Pechtel

답변:


26

DOS / 배치 : 4 바이트

%0>x

이 배치 파일은 자체를 호출 %0( >)하고 출력을이라는 파일로 리디렉션 ( )합니다 x. echo는 기본적으로 켜져 있기 때문에 경로와 명령이 출력됩니다.


결국 디스크 공간이 부족하거나 출력을 덮어 쓰게됩니까?
MathuSum Mut

1
@MathuSumMut : >덮어 씁니다. >>추가
토마스 웰러

1
당신이 이길 것 같아요 : P
MathuSum Mut

2
@ ΈρικΚωνσταντόπουλος : 맞습니다. 이 경우이 챌린지에서 예상 한대로 I / O를 생성하지 않고 0 바이트의 파일이 생성됩니다. 그러나 모든 경우를 고려하는 것이 우리의 임무는 아닙니다. 그렇지 않으면 캐싱, 바이러스 스캐너를 끄고 싶을 수도 있습니다.
Thomas Weller

1
0 바이트 파일을 쓰면 디렉토리 내에서 마지막으로 수정 한 시간을 업데이트해야하므로 디스크 I / O가 여전히 발생합니다.

48

PowerShell v2 +, 10 바이트

for(){1>1}

빈 루프로 무한 for반복합니다. 반복 할 때마다 redirect 연산자1 를 사용 하여 정수 (암시 적으로 문자열로 변환)를 출력 하여 로컬 디렉토리에 이름이 지정된 파일을 덮어 씁니다 .> 1


두 번째 1을 다른 파일 (유효한 파일 이름)로 바꾸거나 1이어야합니까?
Nic Hartley

1
내 Windows VM에서 Winload.exe충분합니다 ...
Comintern

나는 그것이 문자라면 변수로 취급되고 문자열 따옴표로 처리하고 바이트를 낭비하기 때문에 숫자 여야한다고 생각합니다. : P
MathuSum Mut

1
@QPaysTaxes MathuSum에 문제가 없습니다. 1암시 적 구문 분석이 올바르게 작동하려면 두 번째 는 여러 가지 유형이어야합니다. 의 모든 [0-9]것이 동일하게 작동합니다.
AdmBorkBork

1
@Nacht 어쩌면 그것은 내 특정 환경의 기발한 것일 수도 있습니다. 내 ISE (PSv4 Win8.1), 제 2를 대체 1숫자가 아닌 (그리고 지정 등 중 아무것도 .\a또는 a.txt구문 분석 오류의 결과 등).
AdmBorkBork

28

Pyth, 6 바이트

#.w]]0

Pyth의 유일한 파일 출력 명령은 .w입니다. 문자열에서 호출되면 해당 문자열을 추가 모드의 파일에 씁니다.이 질문의 목적에는 좋지 않습니다. 2 차원 배열에서 호출되면 해당 이미지를 해당 파일에 기록하고 파일 내용을 덮어 씁니다. 이것이이 프로그램이하는 일입니다. 기본 파일 출력 이름은 o.png이므로이 프로그램은 파일 o.png을 1 픽셀 흰색 이미지로 무한히 덮어 씁니다 . #무한 루프입니다.


27

더 짧은 (그러나 다른 것보다 지루한) 대답을 원한다면 :

배쉬, 5 바이트

>w;$0

디스크 I / O에 무언가를 쓰는 명령 (3 바이트 미만)이 있으면 더 짧게 만들 수 있습니다. 같은 sync것이 작동하지만 sync4 바이트입니다.

참고 : 이것은 bash에서 직접 실행할 때 작동하지 않으며 스크립트에 넣고 스크립트 이름으로 실행할 때만 작동합니다. (즉 echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)


1
나와 @isaacg의 관계인 것 같습니다. 누가 이기는가?
다니엘

8
exec(또는 . $0)를 선호합니다 . PID가 부족하다고 생각합니다.
muru

1
첫 번째가 w필요한가요? 나를 위해 단순히 >w빈 파일 w을 만들고 mtime 메타 데이터를 지속적으로 업데이트해야하기 때문에 루프에서 수행하면 무한 I / O가 생성됩니다.
Henning Makholm

1
그것이 @HenningMakholm에 해당된다면 그것을 넣을 것입니다.
Daniel

2
스크립트에는 이러한 바이트 만 포함됩니다. bash이기 때문에 컴파일러 나 멋진 것이 필요하지 않습니다.
다니엘

16

루비, 22 20 바이트

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

를 반복해서 잘라 내고 1파일에 씁니다 a.

2 바이트의 Ventero 에게 감사 합니다!


3
open(?a,?w)<<12 바이트를 절약 할 수 있습니다.
Ventero

현존하는 우리를 기뻐 해주신 문 손잡이에 감사드립니다. 나는 겸손합니다.
MathuSum Mut

파일 디스크립터가 누출됩니까? 아니면 범위를 벗어날 때 닫히나요? (IDK Ruby, 죄송합니다).
Peter Cordes

13

cmd, 14 바이트

:a
cd>1
goto a

1문자열을 사용 하여 파일 을 현재 디렉토리에 무한정 덮어 씁니다.


나는 여기에 새롭다 : Windows 줄 바꿈 ( CR LF)은 2 바이트로 계산됩니까?


13
PPCG에 오신 것을 환영합니다! 최소한 최신 시스템 인 Windows는 LF문제없이 처리 할 수 ​​있어야합니다 . 위의 내용은 LFWindows 8.1 에서만 작동 하므로 14 바이트가 정확합니다.
AdmBorkBork

CR LF2 CR1 LF1
Outgolfer Erik

13

배쉬 + coreutils, 10

yes \>b|sh

평가 >bsh위해 파이프되는 연속 스트림을 씁니다 . 매번 0 바이트로 >b불리는 파일을 잘라내기만하면 b됩니다.


4
+1 귀하의 이름이이 코드 스 니펫이 수행 할 작업에 실제로 적합하기 때문에
Olivier Dulac

b그렇지 c않습니까?
CalculatorFeline

9

펄 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 : 스칼라, 배열 또는 해시와 같은 일반 변수가 아닙니다. 그것은 간단히 말해서입니다. 문맥에 따라 베어 단어를 하위 (함수), glob, 생각 또는 파일 처리로 사용할 수 있습니다. (아마도 다른 사람들이 있습니까?)
g4v3

8

PHP, 60 30 17 16 15 바이트

@manatwork가 제안한대로 다시 업데이트되었습니다.

while(!`cd>1`);

또한 이제 테스트되었습니다.


22 바이트의 부정 행위

while (exec ( '> 1 디렉토리'));

@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'); (fputs ($ a, 1)) 되감기 ($ a);

내 첫 번째 게시물은이 작업을 시도했기 때문에 합류했습니다. 파일 쓰기가 성공하면 파일 포인터를 되 감아 시작하십시오.


file_put_contents ()보다 작을 수는 없습니다.


5
while(file_put_contents(1,1));충분해야합니다. 코드 태그 대신 PHP 실행php -r '…' 메타에 대한 합의에 따라 명령 줄에서 전체 스크립트를 실행할 수 있습니다. -r
manatwork

실제로 디스크에 쓰거나 메모리의 버퍼에 쓰는 것입니까?
Brice M. Dempsey

1
@manatwork 오 이런! 나는 항상 개선의 여지가 있다는 것을 알았지 만 그 기능은 그 이름이 짧지 않았습니다. : DI는 버퍼에 대해 모른다. 더 짧은 솔루션으로 답변을 업데이트해야하는지 궁금하다.
diynevala

2
더 짧은 경우 답변을 업데이트하십시오. :)
MathuSum Mut

PHP에서 exec ()를 호출 할 수 있습니까? 나는 그것이 더 이상 PHP의 "범위"에 없다는 것을 알고 있습니다.
diynevala

7

sh, 11 바이트

w>w;exec $0

이것을 loop.sh와 같은 특수 문자없이 파일에 저장하고 실행 가능하게하고 ./loop.sh이와 유사하게 실행하십시오 .

명령의 출력을 w파일에 기록하고 w매번 이전 값을 덮어 씁니다. 그런 다음 동일한 프로그램의 새로운 버전으로 대체되므로 무한정 실행할 수 있습니다.


이것은 두 번째 누락되었습니다 >. 또한 "특별한" $PATH및 "특별한"umask / 파일 시스템 이 있다고 가정하면 w>>w;$07 자리로 줄일 수 있습니다.
mnagel

@mnagel >>이 추가되었습니다. 결국 디스크를 채울 것입니다.
cat

1
@ mnagel 그러나 당신은 exec가 필요없는 것에 대해 옳습니다. 나는 그것을 몰랐습니다. 다른 사람이 그 일을했다, 그래서 나는 그래도 업데이트되지 않습니다
isaacg

3
아니면 . $0대신에 exec $0? 그래도 스택 오버플로 또는 무언가가 발생하는지 모르겠습니다. ... 그래, segfaulted.
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를 보지 못한 방법 : <

13 바이트를 줄인 @Jens 에게 감사 합니다. : D


1
w+모드 읽고 처음에 파일을 절단, 쓰기됩니다. 읽을 필요가 없기 때문에 w파일을 자르지 만 파일을 읽기 모드로 열지 않는 just로 바이트를 줄일 수 있습니다 .
Mego

1
return 0;루프가 종료되지 않는 경우 필요 하지 않습니다.
Jens

1
fputc(1,f)슈퍼-버블 대신에 사용 하지 fprintf(f," ")않습니까?
Jens

1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}에 빈 조건부 이후 for수단 true. 76 바이트
Jens

1
@PeterCordes PPCG는 스택 오버플로가 아닙니다. 코드 또는 답변의 다른 주요 부분을 변경하는 다른 사람의 답변을 편집하지 마십시오. 오타 수정은 괜찮지 만 의견에 사실로 잘못된 진술의 수정을 포함하여 그 밖의 모든 것을 제안해야합니다.
고양이

6

배쉬, 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
112638726

1
좋은 오래된 exec트릭 은 더 잘할 것입니다 : ls>l;exec $0. 짧지 만 지루합니다.
manatwork

:>l;exec $0-파일 생성시 inode 작성
user24582

7
삭제에도 불구하고 y, yes여전히 한 것과 같은 파일 핸들에 쓸 것입니다. 실행 lsof | grep yes하면 다음과 같은 것을 볼 수 /path/to/y (deleted)있습니다. 디스크가 가득 차고 실패합니다.
muru

4
대신 기존 파일을자를 rm y수 있습니다 >y. 또한 조금 짧습니다.
aragaer

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

1
@lirtosiast Jamy의 방어에서의 SSD는 플래시 메모리 =)로 만들어진다
콜트 암몬

어쨌든 바이트 수는 10 바이트 이상 줄어 듭니다. 2nd Mem 화면은 9 바이트 + 프로그램 이름 길이와 같은 헤더를 계산하지만 여기서는 빼지 않습니다.
lirtosiast

@lirtosiast 이것은 RAM이 아닌 계산기의 ROM (영구 메모리)을 반복해서 쓰고 읽습니다. 물론, 계산기 내부에는 실제 하드 드라이브가 없습니다 :)
Jamy Mahabier

@lirtosiast 감사합니다, 나는 그것에 대해 몰랐습니다! (TI-84 +가보고 한 바이트의 양이 핸드 카운트와 일치하지 않는 이유가 궁금합니다 ...) 답변을 업데이트했습니다.
Jamy Mahabier

6

CPython 3.5, 33 16 바이트

while 1:open("a")

네 진짜로 요. :디


while 1:open("a","w")짧고 strace파이썬이 열린, fstat64 및 닫기, 확실히 I / O 작업을 수행 하고 있음을 보여줍니다. 파일이 a이미 존재하면 더 짧을 수 있습니다. while 1:open('a')그래도 여전히 open, fstat64및을 생성 하고 파일을 close수정 atime합니다.
Radovan Garabík

@ RadovanGarabík : 0 감사합니다. 편리한 정보를 몰랐습니다! 물론 구현에 따라 다릅니다.
cat

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

하스켈, 20 바이트

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

"a"이름이 지정된 파일에 문자열 을 쓰고 "b"반복하십시오. writeFile파일이 있으면 덮어 씁니다.


4

자바 스크립트 (Node.js), 43 41 바이트

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

기록 null이라는 이름의 파일로 a, 다음 반복합니다.


1
무엇 쓰기에 대한 c또는 x파일에? 2 바이트를 저장합니다. 또한 require`fs`작동 하지 않습니까?
Charlie

1
쓰기에 좋은 점 @Charlie c또는 x. require`fs`백틱을 사용하여 함수를 호출하면 불행히도 작동하지 않습니다. 왜냐하면 ["fs"](문자열 만) 대신 첫 번째 인수 (배열, 첫 번째 요소 만 전달 된 문자열) 로 함수를 호출하기 때문입니다 "fs". console.log`test`예를 들어 보십시오 .
Michał Perłakowski

4

ZSH, 14 바이트

for ((;;)) :>:

Bsh 및 기타 Bourne과 같은 쉘과 달리 Zsh 는 조건이 적절하게 제한되어 있으면 펜스가 없는 루프를do ... done 허용 합니다.

또한,로 while:

while {} {:>:}

그 주 :내장 명령입니다. 이 루프를 일시 중단 할 수 없습니다.

원칙은 Digital Trauma의 답변 과 동일 합니다. 파일에 아무것도 기록되지 않으며 IO는 파일을 생성하고 자르는 것입니다.


나는 해 나는 muru, 볼 줄이야 말할 , muru을 코드 골프를 온다. PPCG에 오신 것을 환영합니다 : D
cat

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 : 손쉬운 수정 : 최적화로 컴파일해야합니다. 테일 콜 재귀로 하루가 절약됩니다.
Joshua

1
여기에 바이트를 저장하는 데 많은 범위가 있습니다. 안에 물건을 포장 for(;;)하고보다 짧은 기능에 대한 내 대답을 참조하십시오 fprintf. stdio.h (필요하지 않은)를 포함해야한다면 공백이 필요하지 않습니다.#include<stdio.h>
Peter Cordes

3

수학, 14 바이트

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

현재 디렉토리에 "a"이름이 지정된 파일에 문자열 을 반복해서 쓰고 a존재하지 않는 경우 작성합니다.


문자열 "a"또는 변수 a의 내용을 작성합니까? 그리고 후자라면, 그 변수가 아직 정의되지 않았다면 어떻게할까요?
Michael Stern

@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

1
gcc와 clang은 두 번째 버전을 컴파일하지 않습니다. GNU C조차도 정적 / 전역 변수의 동적 초기화를 허용하지 않습니다 (호출 open()은 컴파일 타임 상수가 아닙니다). 또한 lseek가 없기 때문에 디스크 공간이 부족합니다. 아마도 utime("a","")루프를 시도해보십시오 ctime. (여전히 open알려진 이름의 파일을 만들어야합니다).
Peter Cordes

@PeterCordes 당신이 옳습니다. 지적 해 주셔서 감사합니다. 결정된.
edmz 2016 년

여전히 디스크를 채우지 않는 OP의 요구 사항을 여전히 만족 시키지는 않지만 여전히 답으로 유지할 가치가 있습니다. (루프에서 내 대답의 닫기 / 다시 열기 (O_TRUNC)보다 더 좋은 아이디어가 없다면) 이전의 의견과 달리 타임 스탬프를 업데이트하는 것은 일반적으로 실제로 Linux에서 실제 디스크 I / O를 생성하지는 않습니다. lazytime내가 대답에서 말한 것처럼 24 시간마다 한 번 쓸 수 있습니다.
Peter Cordes

3

amd64 Linux의 C, 36 바이트 (타임 스탬프 만), 52 49 바이트 (실제 디스크 활동)

open(2)플래그를 하드 코딩 하므로 다른 ABI에서 이식 할 수 없습니다. 다른 플랫폼의 Linux는 동일한 O_TRUNC등을 사용하지만 다른 POSIX OS는 그렇지 않을 수 있습니다.

파일이 소유자 쓰기 액세스로 작성되도록 올바른 권한 인수를 전달하려면 +4 바이트 ( 아래 참조) (이것은 gcc 5.2에서 작동합니다)

다소 이식 가능한 ANSI C, 38/51 바이트 (타임 스탬프 만), 52/67 바이트 (실제 디스크 활동)

@Jens의 팁과 함께 @Cat의 답변을 기반으로합니다.

첫 번째 숫자는 의 반환 값을 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));}

writefor-loop 조건이며 항상 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, 소유자의 쓰기 권한을 포함하는 일이 있지만이 보장되지 않습니다. 066610 진수는 438입니다 . 세 번째 인수 open는 다른 4 바이트를 갖습니다 . 우리는 이미 O_TRUNC 등을 하드 코딩하고 있지만 동일한 ABI에서 다른 컴파일러 또는 libc와 충돌 할 수 있습니다.

우리의 두번째 인수를 생략 할 수없는 open쓰레기 값을 포함 할 일이 있기 때문에 O_EXCL, 그리고 O_TRUNC|O_APPEND너무 개방 실패, EINVAL.


의 반환 값을 저장할 필요는 없습니다 open(). 3항상 그렇기 때문에 이라고 가정합니다 . fd 3 open으로 시작하더라도 첫 번째 반복 후에 닫힙니다. 최악의 경우, open3이 마지막으로 사용 가능한 파일 디스크립터가 될 때까지 새 fd를 계속 엽니 다. 따라서 처음 65531까지의 write()호출은로 실패 EBADF하지만 openfd = 3을 만들 때마다 정상적으로 작동합니다 .

O_WRONLY|O_CREAT|O_TRUNCx86-64 Linux에서 577 = 0x241 = 이 없으면 O_TRUNCinode 모드 시간 및 변경 시간이 업데이트되지 않으므로 더 짧은 인수가 불가능합니다. 실제 디스크 작업을 생성하기 위해 O_TRUNC호출하는 버전에는 여전히 중요하며, write다시 작성하지는 않습니다.

나는 몇 가지 대답을 참조하십시오 open("a",1). a존재하지 않는 경우 O_CREAT가 필요 합니다. O_CREATLinux에서는 8 진수 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.

Linux lazytime마운트 옵션이 활성화 된 파일 시스템에서, inode 타임 스탬프에만 영향을주는 변경은 24 시간마다 한 번만 기록합니다. 해당 마운트 옵션을 비활성화하면 타임 스탬프 업데이트가 SSD를 닳게하는 실용적인 방법 일 수 있습니다. 그러나 여러 다른 답변은 메타 데이터 I / O 만 수행합니다.


대안 :

더 짧은 비 작동 :

main(){for(;;)close(write(open("a",577),"",3));}write의 반환 값을 사용 하여 3arg를 닫아 전달합니다 . 다른 바이트를 저장하지만 amd64의 gcc -O0 또는 -O3에서는 작동하지 않습니다. 세 번째 인수의 가비지 open는 다르며 쓰기 권한이 없습니다. a처음으로 생성되지만 향후 반복은 모두 실패합니다 -EACCESS.

다른 시스템 호출로 더 오래 작동합니다 .

main(c){for(open("a",65);pwrite(3,"",1);)sync();} 바이트를 제자리에 다시 쓰고 sync()시스템 전체의 모든 파일 시스템을 동기화하기 위해 호출 합니다. 이렇게하면 드라이브 표시등이 켜집니다.

우리는 어떤 바이트를 신경 쓰지 않으므로 pwrite에 4 번째 인수를 전달하지 않습니다. 희소 파일의 경우 예 :

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

~ 128TiB의 오프셋에서 1 바이트를 쓰면 범위 맵을 보유하기 위해 300kiB의 공간을 사용하는 xfs가 발생했습니다. HFS + : IIRC가있는 OS X에서는이 작업을 시도하지 마십시오. 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

파일 내용을 널 바이트로 영구적으로 설정합니다.


1

CBM BASIC 7.0, 9 바이트

0dS"a":rU

이 프로그램은 실행될 때 디스크에 반복적으로 저장됩니다. 다음은 기본 키워드 약어를 사용하지 않는 더 읽기 쉬운 버전입니다.

0 dsave "a" : run

1
카세트 테이프가 부족합니까? ;)
MathuSum Mut

1
@MathuSumMut 그 것0 SAVE "A" : RUN
ceilingcat

1

파이썬, 32 바이트

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

파이썬 3에서 실행하면 무한한 수의 경고가 생성됩니다. 또한 비계산 구현으로 실행하면 fd가 부족할 수 있습니다.


참고로, 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수정되지 않은 상태로 반환됩니다 . 이것 (filename, overwrite-flag)은`⎕NPUT '에 대한 올바른 논거가 될 것이다.

'⊃'은 'A'1( 'A') 의 첫 번째 요소를 반환합니다 . 이것은 쓰여질 데이터입니다.

그런 다음 ⎕NPUT실행되고 작성된 바이트 수를보고합니다 (OS에 따라 2 또는 3). 이것은에 대한 올바른 주장이된다 .

가장 왼쪽 'A'1수정되지 않은 상태로 다시 반환됩니다 . 이것은의 왼쪽 인수 입니다.

오른쪽 인수를 무시하고 왼쪽 인수 ( 'A'1)를 반환하면 이 값이에 새 값이됩니다 .

새 값이 이전 값과 동일하므로 작업이 계속됩니다 (영원히).



0

vim 텍스트 편집기, 10 바이트

qa:w<enter>@aq@a

실행 명령을 수행 할 수없는 경우 8 바이트 @a

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.