[C++] / proc / 파일을 파싱하는 것이 안전합니까?


Answers

/proc 파일은 userspace에 일반 파일로 표시되지만 실제 파일이 아니라 userspace ( open , read , close )에서 표준 파일 작업을 지원하는 엔티티입니다. 이것은 커널에 의해 변경되는 디스크상의 일반 파일을 갖는 것과는 매우 다른 점에 유의하십시오.

커널이 수행하는 모든 작업은 sprintf 와 같은 함수를 사용하여 내부 상태를 자체 메모리에 인쇄하고 read(2) 시스템 호출을 실행할 때마다 메모리가 사용자 공간에 복사됩니다.

커널은 일반 파일과는 완전히 다른 방식으로 이러한 호출을 처리하므로 open(2) 읽을 때 데이터의 전체 스냅 샷을 준비 할 수 있고 커널은 동시 호출이 일관되고 원자 적이다. 나는 그걸 어디서든지 읽지는 못했지만 실제로는 그렇지 않다는 것을 의미하지는 않습니다.

내 조언은 특정 유닉스 풍미에서 proc 파일의 구현을 살펴 보는 것이다. 이것은 실제로 표준에 의해 규율되지 않는 구현 문제 (출력의 형식 및 내용)입니다.

가장 간단한 예는 Linux에서 uptime proc 파일을 구현하는 것입니다. single_open 제공된 콜백 함수에서 전체 버퍼가 생성되는 방식에 single_open .

Question

/proc/net/tcp/ 를 분석하고 싶지만 안전합니까?

/proc/ 에서 파일을 열고 두려워하지 않고 다른 프로세스 (또는 OS 자체)가 동시에 변경하게하려면 어떻게해야합니까?




Linux 커널의 procfs API는 읽기가 일관성있는 데이터를 반환하도록하는 인터페이스를 제공합니다. __proc_file_read 있는 주석을 읽으십시오. 항목 1)은이 인터페이스를 설명합니다.

물론,이 인터페이스를 올바르게 사용하여 반환 된 데이터가 일관성이 있는지 확인하는 것이 특정 proc 파일의 구현에 달려 있습니다. 그래서, 질문에 답하기 위해 : 아니오, 커널은 읽기 동안 proc 파일의 일관성을 보장하지 않지만 일관성을 제공하기 위해 파일의 구현을위한 수단을 제공합니다.




알려지지 않은 버그가 없으므로, /proc 에는 손상된 데이터 또는 오래된 데이터와 새 데이터가 혼합되어 읽히는 경쟁 조건이 없습니다. 이 의미에서, 그것은 안전합니다. 그러나 /proc 에서 읽은 많은 데이터가 생성되는 즉시 잠재적으로 구식이되고 경쟁자가 읽거나 처리하는 시점까지는 여전히 경쟁 조건이 있습니다. 예를 들어 프로세스는 언제든지 죽을 수 있으며 새로운 프로세스에는 동일한 PID가 할당 될 수 있습니다. 경합 조건없이 사용할 수있는 유일한 프로세스 ID는 자신의 하위 프로세스입니다. ' 네트워크 정보 (열린 포트 등)에 대해서도 동일하지만 /proc 에있는 대부분의 정보. 자신의 프로세스 및 잠재적으로 하위 프로세스에 관한 데이터를 제외하고 /proc 모든 데이터에 의존하는 것은 위험하고 위험한 방법이라고 생각합니다. 물론 정보 / 로깅 / 등을 위해 /proc 다른 정보를 사용자 / 관리자에게 제시하는 것이 여전히 유용 할 수 있습니다. 목적.