2014-09-03 4 views
1

수정할 수없는 프로그램은 인수로 제공된 파일에 출력합니다. 불필요한 디스크 입출력을 수행 할 필요가 없도록 출력을 RAM에 저장하려고합니다. 필자는 tmpfs를 사용하여 프로그램을 "trick"하여 쓸 수 있다고 생각했지만, 모든 리눅스 배포판이/tmpfs에 tmpfs를 사용하지는 않지만/dev/shm (RedHat)에서는/tmpfs를/run (우분투)에서 사용합니다. 가능한 한 이식성이 좋은 프로그램을 만들고 싶습니다. 사용자 시스템에 tmpfs 파일 시스템을 만들지 않으려 고합니다. 분명히 나는 ​​df | grep tmpfs를 사용하고 반환하는 마운트를 사용합니다.하지만 좀 더 우아한 것을 기대했습니다. 가짜 터미널이나/proc 어딘가에 쓸 수 있습니까?Linux에서 파일을 RAM에 쓰는 방법

+0

어쨌든 Linux의 디스크 캐시로 인해 RAM에 저장됩니다. –

+1

이 질문에'python' 태그가 붙어있어서'stringIO'는 어떨까요? 기본적으로 문자열 변수를 파일로 사용할 수 있습니다. – kindall

+0

작성중인 프로그램이거나 이미 수정할 수없는 프로그램으로 작성된 프로그램입니까? 귀하의 질문은이 문제에 모순됩니다. – duskwuff

답변

1

자식 프로세스가 찾을 수없는 파일을 허용하는 경우 try named pipes 수 있습니다. 명명 된 파이프의 내용은 디스크를 만지지 않습니다.

+0

스레드 프로그램으로 작성했습니다. 파이프를 만들고 두 번째 프로그램을 호출하는 스레드를 만들고 주 스레드를 만듭니다. thread는 파이프를 열어서 unblock하고 다른 프로세스의 데이터를 얻는다. 꽤 잘 작동합니다. – ventsyv

1

파이썬 스크립트를 두 부분으로 나눌 수 있습니다. 하나는 반복적으로 다른 프로그램을 호출하고 다른 하나는 결과를 병합하고 두 번째 부분은 Bash 스크립트로 변환하여 >() 프로세스 대체 구조를 사용하여 의사를 전달할 수 있습니다 파일을 다른 프로그램의 stdin 인 다른 프로그램에 추가하십시오.

의 PoC : 그것은 인수에 파일 이름을 소요하고 여기에 '안녕하세요'를 기록

$ cat otherprogram.py 
#/usr/bin/env python 
import sys 

with open(sys.argv[1], 'w') as file: 
      file.write('Hello\n') 

:

이있는 다른 프로그램을 가정합니다. 5 번 전화해야한다고 가정합니다.

for i in {1..5}; do python otherprogram.py >(cat) ; done 

출력 otherprogram.py이 파일에 쓰기 어떻게 생각하는지 표준 출력됩니다 : 그럼 당신은 이런 식으로 뭔가를 할 수 있습니다. 당신은 다음과 같이 파이썬 스크립트의 다른 부분을 소비 할 수 있습니다 :

$ cat consume.py 
#!/bin/env python 

import fileinput 

for line in fileinput.input(): 
     print "Processing line ", line 

$ { for i in {1..5}; do python otherprogram.py >(cat) ; done } | python consume.py 
Processing line Hello 

Processing line Hello 

Processing line Hello 

Processing line Hello 

Processing line Hello 

그래서 otherprogram.py이가 쓰고 어떻게 생각하는지 (이것은 단순히 '안녕하세요'에 뭔가를 앞에 추가) 파일은 Bash의 프로세스 분리 메커니즘 덕분에 실제로 디스크를 치지 않고 프로그램의 표준 입력을 전송합니다.

+0

그럴 것이라고 생각합니다! 아마도 bash 스크립트로 분할 할 필요조차 없으며, 파이썬에서 subprocess.Popen() 호출을 통해 직접 호출 할 수 있습니다. 오늘 밤에 나중에 시험해보고 어떻게 작동하는지 알려 드리겠습니다. – ventsyv

+0

@ user2036161 :'>()'은 아마도/proc/self/fd /를 통해 구현 될 수 있습니다. 다른 곳에서는 명명 된 파이프를 사용합니다. – jfs

4

/proc/self/fd/1을 하위 프로그램의 파일 이름으로 전달하십시오. /proc/self/fd/1에 대한 모든 쓰기는 실제로 하위 프로그램의 stdout으로 이동합니다. 자녀의 표준 출력을 캡처하려면 subprocess.Popen() 등을 사용하십시오.

+0

모든 Linux 버전에서 작동해야하며 프로그램을 실행하는 사용자는 항상 파일 맞지? – ventsyv

+0

아마 각각 예, 그렇습니다. –

+0

@ user2036161 -이 기술의 이식성에 대한 설명은 다음과 같습니다. http://unix.stackexchange.com/questions/123602/portability-of-file-descriptor-links –

관련 문제