Запуск различных версий одного и того же двоичного файла, одного и того же файла

Вопрос:

У меня есть один двоичный файл, который может работать в режиме сервера или клиента. Его можно использовать следующим образом:

$ ./a.out --server &
$ ./a.out --client &

Они разговаривают друг с другом, и это хорошо работает. Мой вопрос в том, каково ожидаемое поведение при запуске сервера:

$ ./a.out --server &

Но потом я забыл убить его и продолжить работу по разработке, редактированию и созданию и запуску клиента:

$ edit client.c
$ make
$ ./a.out --client
^C
<repeat>

Теперь без установленного липкого бита моя ОС (Ubuntu) запускает две разные версии моего двоичного кода? Или он принимает ярлык и использует экземпляр in-memory и, следовательно, игнорирует мою последнюю сборку? Есть ли другие побочные эффекты этой ошибки?

Лучший ответ:

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

Итак, в вашем примере есть две версии программы. Один побочный эффект — если вы вносите изменения, которые вызывают большую несовместимость, ч/б ваш код сервера и клиента — например, изменения в структурах пакетов. Вероятно, вы увидите странное, необъяснимое поведение, сбои и т.д. Всегда полезно убить фоновый сервер и повторно запустить весь тест.

Ответ №1

Если вы не измените код сервера, просто скопируйте ваш a.out в «my_server», например, затем запустите его как my_server —server. make заменит a.out, но не my_server.

Другой способ — заставить make убить всех запущенных a.out-s непосредственно перед перекомпиляцией: добавить цель «все» (она должна быть первой в make файле), которая зависит от a.out и выполняет «killall a.out».

Оцените статью
TechArks.Ru
Добавить комментарий