Рекомендую всем, что работает с OpenVZ!
Thursday, 29 October 2015
Tuesday, 27 October 2015
Бесплатный журнал Интернет изнутри от MSK-IX
Прошу любить и жаловать всех, кто так или иначе связан с сетью Интернет.
Сетевикам прочтение крайне обязательно: http://www.ccni.ru/download/InternetInside/InternetInside_N1.pdf
Сетевикам прочтение крайне обязательно: http://www.ccni.ru/download/InternetInside/InternetInside_N1.pdf
Thursday, 8 October 2015
Реалии использования динамических библиотек скомпилированных силами Go из С/С++
Всем известно, что начиная с версии 1.5 Golang научился делать бинарные динамические .so библиотеки (go build -buildmode=c-shared -o libgobgp.so *.go), которые можно прилинковать к православному C коду.
Но если копнуть дальше, на деле это не совсем .so библиотека и привычного нам машинного кода там нету.
А есть обертки, которые вызывают код из Golang и подставляют себя С функциями.
Дада, Вы верно догадываетесь, Go's runtime запускается рядом. Не заметить это сложно - появляется 5ка тридов рядом с вашей программой Смайлик «smile»
Но это пол беды - этот рантайм запускается в момент запуска Вашего С-приложения, автоматически.
И если оно форкается или форкается и потом использует popen - горевать Вам очень долго, потому что многопоточное приложение, которым с момента запуска int main стал Ваш любимый софт из-за Go рантайма нельзя форкать, будет все крайне плохо Смайлик «smile»
Я даже молчу, что этот самый Го рантайм подменяет обработчики привычных нам сигналов и заворачивает их на себя, что может вызвать серьезный баттхерт у любителей поиграться с сигналами.
Как чинить? Линковаться динамически в рантайме, силами dlopen/dlsym, как сделал я - тут.
Вот так вот друзья - не все так просто, за все нужно платить Смайлик «smile»После этого фикса все стало работать решительно приличнее, но совершенно никаких гарантий, что так будет и впредь.
Но если копнуть дальше, на деле это не совсем .so библиотека и привычного нам машинного кода там нету.
А есть обертки, которые вызывают код из Golang и подставляют себя С функциями.
Дада, Вы верно догадываетесь, Go's runtime запускается рядом. Не заметить это сложно - появляется 5ка тридов рядом с вашей программой Смайлик «smile»
Но это пол беды - этот рантайм запускается в момент запуска Вашего С-приложения, автоматически.
И если оно форкается или форкается и потом использует popen - горевать Вам очень долго, потому что многопоточное приложение, которым с момента запуска int main стал Ваш любимый софт из-за Go рантайма нельзя форкать, будет все крайне плохо Смайлик «smile»
Я даже молчу, что этот самый Го рантайм подменяет обработчики привычных нам сигналов и заворачивает их на себя, что может вызвать серьезный баттхерт у любителей поиграться с сигналами.
Как чинить? Линковаться динамически в рантайме, силами dlopen/dlsym, как сделал я - тут.
Вот так вот друзья - не все так просто, за все нужно платить Смайлик «smile»После этого фикса все стало работать решительно приличнее, но совершенно никаких гарантий, что так будет и впредь.
Subscribe to:
Posts
(
Atom
)