Как определить, запущено ли уже приложение? C портативным Linux/Win
Есть ли способ написать код на C, который позволит нам определить, запущен ли предыдущий экземпляр приложения? Мне нужно проверить это портативным способом для Linux и Windows, обе из которых используют последнюю доступную версию GCC.
Любые примеры переносимого кода окажут огромную помощь. Я вижу два варианта сейчас:
- Проверьте список процессов. Здесь Linux имеет хорошие инструменты, но я не думаю, что те же функции применимы к Windows. Может быть, некоторые библиотеки GNU для обоих SO? Какие библиотеки или функции?
- Сохраните и заблокируйте файл. Теперь, как это сделать так, чтобы обе системы могли понять? Одна проблема, где сохранить файл? Деревья путей отличаются от каждой системы. Кроме того, если выбран относительный путь, два приложения могут работать с разными заблокированными файлами в разных каталогах.
Спасибо! Беко.
PS. У СО есть разные реквизиты, поэтому, если вы знаете одно, а не другое, пожалуйста, ответьте. В конце концов, если не существует переносимого "одиночного" способа, я все еще могу использовать #ifdef и коды, предложенные в качестве ответа.
Язык C (не C++), консольное приложение, gcc, linux и windows
4 ответа
К сожалению, если вы ограничитесь C, у вас могут возникнуть трудности с переносом. В C++ есть улучшенный межпроцессный named_mutex, но в C вам придется либо:
- UNIXes (включая Mac OS): откройте и скопируйте файл куда-нибудь. Традиционно вы также впишите свой текущий PID в этот файл. ПРИМЕЧАНИЕ. Это может быть небезопасно для NFS; но ваши возможности там крайне ограничены. В Linux вы можете использовать
/dev/shm
путь, если вы хотите убедиться, что он локальный и безопасный для блокировки. - Windows: открыть и заблокировать именованный мьютекс
Для окон хорошо работает мьютекс.
http://msdn.microsoft.com/en-us/library/ms682411(v=vs.85).aspx
в статье также упоминается альтернатива мьютексу....
Чтобы ограничить ваше приложение одним экземпляром на пользователя, создайте заблокированный файл в каталоге профиля пользователя.
Канонический метод в Unixland заключается в том, чтобы процесс записывал свой собственный PID в файл в известном месте. Если этот файл существует, то программа может проверить свой собственный pid (доступный по системному вызову) с тем, который указан в этом файле, и если он незнаком, вы знаете, что запущен другой процесс.