하드 드라이브에 액세스해야 합니까, 아니면 모든 것이 메모리에서 수행됩니까? 기본적으로 meminfo와 cpuinfo에서 업데이트된 값을 계속 얻고 싶습니다.
업데이트된 값을 얻으려면 파일을 다시 열고 다시 읽어야 합니까, 아니면 그냥 다시 읽어도 됩니까? 현재 Linux 설치에 액세스할 수 없습니다.
답변1
를 읽으면 /proc
커널이 콘텐츠를 동적으로 생성합니다. 하드 드라이브는 관련되지 않습니다.
당신이 하고 있는 일은 많은 모니터링 프로그램이 하는 일과 유사하므로, 그들이 하는 일을 살펴보는 것이 좋습니다. 예를 들어 top이 수행하는 작업을 확인할 수 있습니다.
strace top >/dev/null
추적은 top이 on , 및 /proc/uptime
set /proc/loadavg
되고 사라진 것을 보여줍니다. top 을 제외한 모든 파일에 대해 (가상) 파일의 시작 부분으로 돌아가서 디스플레이가 새로 고쳐질 때마다 다시 읽습니다./proc/stat
/proc/meminfo
/proc/uptime
대부분의 데이터는 /proc/cpuinfo
일정하지만 일부 필드(예: 특정 시스템의 CPU 속도)는 동적으로 업데이트됩니다.
proc 파일 시스템은 다음 커널 문서에 문서화되어 있습니다.Documentation/filesystems/proc.txt
. 난해한 세부 사항이 절망적이라면 다음을 수행할 수 있습니다.소스 코드 찾아보기.
답변2
/proc 파일 시스템은 소위 "의사 파일 시스템"으로, 이는 디스크를 사용하지 않는다는 의미입니다.
이것이 가장 낮은 수준에서 어떻게 작동하는지 잘 모르므로 틀릴 수도 있지만 여기에 있습니다. 내가 달리면
f = open('/proc/meminfo')
f.read()
f.seek(0)
f.read()
두 가지 다른 출력이 나타납니다. Afaik,eek(0)은 읽기 오프셋만 재설정하고 파일을 다시 열지 않습니다. 이는 파일을 다시 읽는 것만으로도 새로운 값을 얻을 수 있음을 보여줍니다.
즉, Linux용으로 개발하는 경우 Linux 상자에 영구적으로 액세스하는 것이 매우 논리적인 것처럼 보입니다.
답변3
이러한 파일은 디스크에 저장되지 않지만 커널에 대한 후크입니다.
파일을 열면( 사용 fopen()
) 커널이 이 작업을 처리합니다. 마운트 지점을 탐색하여 요청을 처리할 적절한 드라이버를 찾은 다음 해당 드라이버에 작업을 전달합니다.
의 경우 /proc
파일 읽기 요청은 커널의 내부 "proc" 시스템으로 전달됩니다. 파일을 읽으면 메모리의 값이 반환됩니다.
비슷한 패턴이 발생합니다 /dev
. 커널은 특정 장치 ID를 사용하여 개발 노드를 여는 것을 확인하고 IO 스트림을 요청을 처리하는 특정 드라이버와 연결합니다.
기본적으로 meminfo와 cpuinfo에서 업데이트된 값을 계속 얻고 싶습니다.
proc 파일 시스템을 읽어 이러한 값을 읽거나 사용할 수 있는 다른 시스템 호출이 있는지 확인할 수 있습니다. 그러나 이는 폴링 메커니즘이므로 항상 일부 시스템 로드가 관련됩니다.
답변4
이 /proc
파일 시스템은 의사 파일 시스템입니다. 이는 사용자 공간에서 커널 공간으로 또는 그 반대로 메모리를 전송하는 편리한 방법입니다.
디렉토리의 각 항목(파일 또는 디렉토리)은 /proc
커널의 일부에 의해 생성됩니다. 각 항목을 읽거나 쓸 수 있습니다. 일반 파일처럼 사용자 공간에서 열 수 있습니다. 항목은 대략 다음과 같이 생성됩니다(커널 모듈 내에서):
procentry1 = create_proc_entry(path);
procentry1->read = read_function1;
procentry->write = write_function1;
따라서 생성할 경로와 읽기/쓰기 시 호출할 함수를 대략적으로 지정합니다(하나 또는 둘 다 필요함). 읽기 함수는 문자열을 반환하고(파일 읽기 호출과 유사) 쓰기 함수는 문자열을 받습니다. 프로그램이 해당 proc 파일 경로를 읽고 쓰려고 시도할 때마다 해당 읽기 및 쓰기 함수가 호출됩니다.