2017-02-01 12 views
-1

제 응용 프로그램에서 프로세스가 죽으면 다시 생성되는 C 프로세스가 생성되었습니다. 이제는 프로세스가 처음으로 (시스템 재부팅 후) 생성되었거나, 함수 X가 호출되거나 프로세스가 어떤 함수 Y로 인해 크래시 (런타임) 이후에 다시 생성되는지 여부를 알아야합니다. 호출됩니다.리눅스에서 비 지속적 파일을 만드는 가장 좋은 방법은 무엇입니까

mktemp() 명령을 사용하여 임시 파일을 만들려고했지만 재부팅 후에도 파일이 지속되는 것처럼 보였습니다.

그래서 가장 좋은 방법은 무엇입니까?

+0

파일에 정보 또는 데이터 저장소가 있습니까? –

+0

@AndrewHenle 파일에 정보가 없습니다. 부팅 후 처음 스폰 된 프로세스인지, 충돌 후 다시 생성 된 것인지 확인하는 방법으로 사용됩니다. – Manoj

+0

(만들기 및 첨부) 공유 메모리 세그먼트. 프로세스 종료 (또는 충돌) 후에도 지속되지만 재부팅은 지속되지 않습니다. – wildplasser

답변

2

mktemp은 (기본값) /tmp에 파일을 생성합니다. 많은 배포본에서 /tmp은 영속적입니다 (예 : 메모리 백업이 아닌 디스크 백업).

당신이 찾고있는 것은 메모리 지원 마운트에 파일을 만드는 것입니다. 일반적으로 이들은 tmpfs 마운트입니다. 예를 들어, 내 아치 리눅스 노트북에, 내의 tmpfs 마운트는 다음과 같습니다

$ mount | grep tmpfs 
[..] 
run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755) 
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime) 

그래서이 시스템에서, 내가 열고 /run/dev/shm/에서 파일을 작성하고 그들은 내 기억에 의해 백업됩니다 수 있습니다, 그들은하지 않습니다 부츠를 가로 질러 지속되면 액세스가 빠르고 저렴해질 것입니다.

위로 질문에, 당신은 mktemp에 의해 사용되는 디렉터리를 변경할 수있는 것 같습니다. 맨 페이지 인용 :

-p DIR, --tmpdir[=DIR] 
       interpret TEMPLATE relative to DIR; if DIR is not specified, use $TMPDIR if set, else /tmp. With this option, TEMPLATE must not be 
       an absolute name; unlike with -t, TEMPLATE may contain slashes, but mktemp creates only the final component 

편집을 - 몇 가지 :

  • 이 모든 유통에 의존; 다른 배포본에서는 tmpfs/tmp에 마운트 할 수 있습니다.
  • 흥미롭게도/dev/shm은 shm_open으로 생성 된 공유 메모리 객체가 저장되는 곳입니다.
+0

실제로 개발중인 응용 프로그램은 powerpc 아키텍처가있는 임베디드 응용 프로그램입니다. 시스템이 재부팅 될 때마다/tmp 디렉토리의 파일을 삭제하도록 실행해야하는 스크립트가 실행되어 실행되지 않아/tmp 디렉토리의 파일이 지속성 있는. 어쨌든 @Ezequiel Garcia에 대한 제안에 감사드립니다. 그것을 해결했습니다 :) – Manoj

+0

글쎄, 나는 당신이 원하는/tmp를에 따라 달라집니다 같아요. 디스크로 백업 된 임시 저장소가 필요하며 재부팅시이를 제거하고 싶습니까? 좋아. 내 임베디드 플랫폼에서는 tmpfs를'/ tmp'에 마운트하므로 디스크를 사용하지 않고 재부팅시 아무것도 제거 할 필요가 없습니다. –

1

예 : open, 즉시 파일을 제거하십시오 (unlink). 파일을 열었으므로 여전히 파일을 사용할 수 있지만 닫을 때 (즉, close으로 명시 적으로 또는 프로세스가 종료 될 때 OS가 파일을 닫으므로 충돌이 발생하지 않을 것입니다).

+1

저는 아이디어가 다른 프로세스가 이미 프로세스가 생성되었는지 결정하기 위해 파일의 존재를 검사 할 것이라고 생각합니다. 이 스키마가 작동하지 못하도록 파일을 삭제하면 ... – fjardon

+0

아이디어는 파일의 존재 여부만으로 부팅 시간 기능 (질문에 대한 기능 X wrt)을 호출해야하는지 또는 런타임 함수를 호출해야합니다. 그래서 파일에 무엇이든 쓰지는 않을 것입니다. 나는 단순히 존재를 사용하여 호출 할 함수를 결정해야합니다. – Manoj

2

persistent/tmp와 관련된 문제가 없습니다. 타임 스탬프를 확인하고 부팅 시간과 비교할 수 있습니다. 시대에

부팅 시간 : 시대에

stat -c %Y /proc/1 

파일 작성 시간 :

stat -c %Y filename.tmp 

이 방법의 가장 큰 장점은 배포판 고유의 tmpfs 설정

을에 의존하지 않기 때문에, 휴대 성이다
+0

프로세스의 충돌은 예측할 수 없으므로 타임 스탬프 개념을 사용하여 프로세스가 처음 생성되거나 충돌 후 생성되는지 여부를 결정할 수 없습니다. – Manoj

+0

왜 안 되니? 부팅 시간과 생성 시간의 차이가 부팅 시간보다 긴 경우 다시 생성 된 것으로 알고 있습니다 – Bruno9779