2011-04-08 3 views
2

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

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

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

Спасибо! Beco.

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

языка C (не C++), консольное приложение, GCC, Linux и окна

ответ

1

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

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

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

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

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

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

+0

Hi @Keith. Каков полный путь к этому каталогу? Есть ли переменная, которая работает?Я отредактировал вопрос, чтобы объяснить некоторые сомнения при попытке сделать это в обеих системах. Спасибо за ваше время! –

0

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

+0

Для окон рассмотрите ответ Кита. Я не уверен, что это работает, но вы можете попробовать. –

1

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

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