После комментариев к одному из моих вопросов меня заинтриговало, что происходит, когда кто-то перезаписывает исполняемый файл. Мне нужно проверить мое понимание по этому поводу.
Допустим, у меня есть / usr / bin / myprog
. Я запускаю его, и поэтому ОС загружает / usr / bin / myprog
, вероятно, через http://en.wikipedia.org/wiki/Memory-mapped_file#Common_uses .
По какой-то причине этот процесс остается в памяти, и я решаю, что на самом деле я Мы исправили ошибку, и я перезаписал / usr / bin / myprog
.
Итак, насколько я понимаю:
myprog
уже загружен и Я заменяю файл, из которого уже был загружен myprog
, экземпляр myprog
не изменяется. myprog
, он будет использовать новый код. Я прав?
Однако, согласно статье о файлах с отображением памяти, такой метод позволяет разработчику обрабатывать части файла, как если бы они были физической памятью.
Итак, я вижу противоречие в том, как я понимал вещи. Если страницы действительно загружаются только по запросу, то при условии, что myprog
не загружен на 100%, эта статья в Википедии подразумевает, что новые страницы будут загружаться из файла на диске, который изменился с момента загрузки исходного изображения.
Однако я почти уверен, что два моих скомпилированных изображения не будут одинаковыми и что соответствующие смещения адресов для каждого файла не идентичны. Итак, предполагая, что это произойдет, указатель инструкции очень сильно потеряется ... Я почти уверен, что операционная система не загружает части двух разных изображений в память как часть одного и того же процесса.
Так как же получается комбинация работы по отображению памяти / подкачке запросов для выполнения программ, пожалуйста? Может ли перезапись этого файла вызвать сбой страницы на каждой из страниц исполняемых файлов, чтобы убедиться, что он загружен для текущего запущенного процесса?
Я провел быстрый эксперимент с этим:
#include
#include
int main(int argc, char** argv)
{
printf("Program resident...");
while(1)
{
printf("??? Just notifying you I'm still here...\n");
usleep(1000000);
}
return 0;
}
И, конечно же, я мог а) заменить это исполняемый файл во время его работы и б) его вывод не изменился.
Итак, что происходит? Я' Я особенно благодарен за любые предложения, которые я могу сделать, чтобы увидеть, что произойдет (Linux или Windows).
Всем спасибо.
Изменить: вопрос, на который я имел в виду, который вызвал этот вопрос: Обновления без перезагрузки - что Какие проблемы случаются на практике?
Кроме того, я знаю, что это не относится конкретно к программированию, а относится к результату обновления исполняемого файла. Однако мне все еще интересно, и я не могу придумать лучшего места, чтобы спросить об этом.