2013-07-05 3 views
1

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

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

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

$ ./a.out --server & 

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

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

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

ответ

2

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

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

+0

Спасибо, это именно то, чего я боялся, и на самом деле видел. –

1

Если вы не изменили код сервера, просто скопируйте ваш a.out в 'my_server', например. Затем запустите его как my_server -сервер. make заменит a.out, но не my_server.

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

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