Как определить, запущено ли уже приложение?C портативным Linux / Win - PullRequest
2 голосов
/ 08 апреля 2011

Есть ли способ написать код на C, который позволит нам определить, запущен ли предыдущий экземпляр приложения? Мне нужно проверить это портативным способом для Linux и Windows, обе из которых используют последнюю доступную версию GCC.

Любые примеры переносимого кода могут оказать огромную помощь. Теперь я вижу два варианта:

  1. Проверьте список процессов. Здесь Linux имеет хорошие инструменты, но я не думаю, что те же функции применимы к Windows. Может быть, некоторые библиотеки GNU для обоих SO? Какие библиотеки или функции?
  2. Сохраните и заблокируйте файл. Теперь, как сделать это так, чтобы обе системы могли понять? Одна проблема, где сохранить файл? Деревья путей отличаются от каждой системы. Кроме того, если выбран относительный путь, два приложения могут работать с разными заблокированными файлами в разных каталогах.

Спасибо! Беко.

PS. У СО есть разные реквизиты, поэтому, если вы знаете одно, а не другое, пожалуйста, ответьте. В конце концов, если не существует переносимого «одиночного» способа, я все еще могу использовать #ifdef и коды, предложенные в качестве ответа.

Язык C (не c ++), консольное приложение, gcc, linux и windows

Ответы [ 4 ]

1 голос
/ 25 мая 2011

К сожалению, если вы ограничитесь C, у вас могут возникнуть трудности с переносом. С C ++ есть расширенный межпроцессный named_mutex , но на C вам придется либо:

  • UNIX (включая Mac OS): откройте и скопите файл куда-нибудь. Традиционно вы также впишите свой текущий PID в этот файл. ПРИМЕЧАНИЕ. Это может быть небезопасно для NFS; но ваши возможности там крайне ограничены. В Linux вы можете использовать путь /dev/shm, если хотите обеспечить его локальную и безопасную блокировку.
  • Windows: откройте и заблокируйте с именем mutex
1 голос
/ 08 апреля 2011

Канонический метод в Unixland заключается в том, чтобы процесс записывал свой собственный PID в файл в известном месте. Если этот файл существует, то программа может проверить свой собственный pid (доступный по системному вызову) с тем, который указан в этом файле, и если он незнаком, вы знаете, что запущен другой процесс.

1 голос
/ 08 апреля 2011

для windows, мьютекс работает хорошо.

http://msdn.microsoft.com/en-us/library/ms682411(v=vs.85).aspx

в статье также упоминается альтернатива мьютексу ....

Чтобы ограничить ваше приложениеодин экземпляр на пользователя, создайте заблокированный файл в каталоге профиля пользователя.

0 голосов
/ 08 апреля 2011

C не предоставляет встроенных средств для проверки, запущено ли уже приложение, поэтому сделать его кросс-платформенным сложно / невозможно.Однако в Linux можно использовать IPC .И в Windows (я не очень опытен в этой категории), вы можете найти это полезным.

...