2017-02-01 9 views
-1

В моем приложении у меня есть процесс C, который будет повторно создан, если процесс замирает. Теперь у меня есть требование узнать, вызван ли процесс в первый раз (после перезагрузки системы), из-за которого будет вызвана функция X или если процесс был восстановлен после сбоя (время выполнения), из-за которого функция Y будет вызываться.Каков наилучший способ создания непостоянного файла в linux

Я попытался создать временные файлы с помощью команды mktemp(), но файлы, казалось, были постоянными даже после перезагрузки.

Так что было бы лучшим способом сделать это?

+0

Есть ли в базе данных или данные? –

+0

@AndrewHenle Нет информации в файле, это будет просто использоваться, чтобы узнать, был ли процесс, который этот процесс появился в первый раз после загрузки или повторного появления после сбоя – Manoj

+0

(create and) сегмент разделяемой памяти. Они сохраняются после процесса (или сбоя), но не перезагружаются. – wildplasser

ответ

2

mktemp создает файлы в /tmp (по умолчанию). Во многих дистрибутивах /tmp является постоянным (то есть с резервным копированием на диске, а не с поддержкой памяти).

Что вы ищете, это создать файл на жестком диске с поддержкой памяти. Обычно это монстры tmpfs. Например, на моем Arch Linux ноутбук, мои 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) 

Так в этой системе, я могу открыть и записывать файлы в /dev/shm/ на /run и они будут подкреплены моей памяти, они не будут сохраняются через ботинки, и доступ будет быстрым и дешевым.

На ваш вопрос, возможно, вы можете изменить каталог, используемый 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 

EDIT - еще несколько вещей:

  • все это распределение зависит от способа; другие распределения могут устанавливаться tmpfs по адресу /tmp.
  • интересно,/dev/shm, где хранятся объекты общей памяти, созданные с помощью shm_open.
+0

На самом деле разрабатываемое приложение представляет собой встроенное приложение, имеющее архитектуру powerpc. Некоторый скрипт должен быть запущен для удаления файлов в каталоге/tmp каждый раз при перезагрузке системы, которая не выполнялась, тем самым создавая файлы в каталоге/tmp упорный. В любом случае спасибо за предложение @Ezequiel Garcia. Это получилось :) – Manoj

+0

Ну, я думаю, это зависит от того, что вы хотите '/ tmp'. Вам требуется временное хранилище с жестким диском, и вы хотите удалить его при перезагрузке? Тогда отлично. На моих встроенных платформах я монтирую tmpfs на '/ tmp', поэтому я не использую для него диск (и не нужно ничего удалять при перезагрузке). –

1

Создайте файл, используя, например, open, затем сразу же удалите файл (с unlink). Поскольку у вас есть это, файл будет по-прежнему доступен вам, но как только он его закрывает (явно с close или потому, что ОС закрывает его, когда процесс завершается (сбой или нет)), тогда он будет как никогда не существовал.

+1

Я думаю, идея состоит в том, что другой процесс будет проверять наличие файла, чтобы решить, если процесс уже порожден. Удалив файл, вы запретите эту схему работать ... – fjardon

+0

Идея заключается в том, что существование файла поможет мне определить, нужно ли вызывать функцию времени загрузки (функция X wrt на заданный вопрос) или время выполнения функция должна быть вызвана. Поэтому я не собираюсь писать ничего в файл, я просто использовал бы его существование, чтобы решить, какую функцию нужно вызывать. – Manoj

2

Я не вижу проблемы с постоянным/tmp. Вы можете проверить отметки времени и сравнить их с временем загрузки.

время загрузки в эпоху:

stat -c %Y /proc/1 

файл время создания в эпоху:

stat -c %Y filename.tmp 

Самым большим преимуществом этого подхода является портативность, так как она не зависит от дистрибутива конкретных настроек TMPFS

+0

Но авария процесса непредсказуема, поэтому нельзя полагаться на концепцию метки времени, чтобы определить, появился ли процесс в первый раз или порожден после крушения. – Manoj

+0

Почему бы и нет? Если разница между временем загрузки и временем создания превышает время загрузки ej 2 *, вы знаете, что это респаун – Bruno9779

 Смежные вопросы

  • Нет связанных вопросов^_^