Max
ага
Max
окей, задам, надеюсь ответ найдется :)
итак, у меня есть приложение на Си, которое пользует mqtt paho library. важно что либа сама разруливает работу с протоколом, сокетами и сама пуляет треды, трогать её код не желательно.
по приходу сообщенек по mqtt я должен выполнить те или иные действия. вот дело дошло до запуска консольных комманд.
"красивым" способом должен быть fork() + execl()/execle(), но получается child получит те же сокеты (на которых висит mqtt), что и parent. и что в итоге будет, если по mqtt приедет в это время запрос (паблиш)? кому он прийдет? чайлду? паренту? одновременно обоим?
Egor
Будет жесть скорее всего, потому что сокеты в родителе и ребёнке вроде как остаются пошаренные. То есть родитель прочитал — у ребёнка пропал кусок данных.
Egor
И получаем прекрасный race condition
Max
вот вот, и я о том же
Max
если ребенок без сокета останется - не страшно, детей не жалко. а вот если парент без данных - беда, пичаль
Egor
Ребёнок может после форка прибить все свои сокеты. Наверняка есть вариация exec, которая это делает.
Egor
Хотя стоп: если после форка идёт exec, то разве неверно, что весь код, который теоретически мог бы читать из старых сокетов, умрёт?
Egor
Даже если загрузится точно такой же, то у него уже будут новые данные, а про старые сокеты он ничего знать не будет. В крайнем случае будет утечка.
Max
после fork и перед exec может пройти время, могут зашедулить вообще треды mqtt либы, а не мой тред, который сделал fork
Max
вот я и думаю как это обойти
Max
если я скажу после fork() либу убить себя - она не поймет и отконнектиться от сервера. парент этого тем более не поймет
Дмитрий ⬡
Привет! У сокетов есть свойство — закрыть при exec
Max
а закрыть при fork? :)
Дмитрий ⬡
Собственно, называеться O_CLOEXEC или как-то так, в Мане есть.
Max
точнее не так, если ли какой-то способ попросить fork() не шарить файловые дескрипторы?
Дмитрий ⬡
Вообще, стоп-кран. Форк + многопоточность это очень плохой план.
Дмитрий ⬡
При форке остальные потоки не копируются, делай что хочешь.
Max
погоди, погоди
Max
ты сказал не копируются?
Max
* The child process is created with a single thread—the one that called fork(). The entire virtual address space of the parent is replicated in the child, including the states of mutexes, condition variables, and other pthreads objects; the use of
pthread_atfork(3) may be helpful for dealing with problems that this can cause.
кажется я дурак и не дочитал ман
Max
пасибо
Berkus
Vladislav
Vladislav
а не, дочитал, что надо, сорян. clone() не подойдет, подойдет O_CLOEXEC или принудительное закрытие после fork/clone(без CLONE_FILES)
Anonymous
Здравствуйте. Что такое Manual Map?
Berkus
Stanislav
что то связанное с инжектом длл
Stanislav
ага, без использования LoadLibrary
Arseny
гугл никто не отменял, например тут вполне адекватное описание
https://guidedhacking.com/showthread.php?58-Manual-Map-Injection
Alexander "SonnySlave"
http://docs.conan.io/en/latest/conan1.0.html
Stanislav
Berkus
Berkus
conan: stable 0.30.3 (bottled), HEAD
Berkus
а брю не обновили!
Alexander "SonnySlave"
https://marketplace.visualstudio.com/items?itemName=vs-publisher-690586.ClangPowerTools&utm_content=buffera47ae&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer
Igor
Dr. Friedrich
Alexander "SonnySlave"
oles
подскажите posix механизм разделяемой памяти предпологает что после того память подмаплена в процесс в нее можно писать через write?
Aidar
Berkus
Berkus
просто shm_open отдает file handle в который таки пишут write/read
Aidar
Aidar
там все файл в posix
Berkus
ну да, если хочешь к нему обращаться как к блоку памяти делай mmap
Aidar
oles
ок спасибо
Aidar
что мешает взять и проверить
oles
я проверил просто уточнить хотел
Berkus
в доках ничего нет про запись и чтение в этот дескриптор, так что надо проверять)
oles
Alexander "SonnySlave"
http://en.cppreference.com/w/cpp/utility/launder
Aidar
Berkus
Berkus
Berkus
семантика языка и избежание УБ
Berkus
пожалуй я больше не хочу писать на с++
Vsevolod
да было бы на чем писать еще :\
Berkus
Rust есть, Kotlin-native есть
Berkus
даже прости господи гошечка без генериков есть
Alexander "SonnySlave"
Vsevolod
ну, кроме раста, остальное - это дегенеративность какая-то
Alexander "SonnySlave"
Vsevolod
а раст никак не утрясется
Vsevolod
вот окамль, разве что, неплох, если бы не три стандартных библиотеки :(
Arseny
Alexander "SonnySlave"
Arseny
Vsevolod
а зачем идти к мудакам?
Alexander "SonnySlave"
Alexander "SonnySlave"
есть немало личностей, которое хотят свой ЧСВ почесать таким вот говном
Vsevolod
котлин даже не смотрел - он же jvm был раньше (https://github.com/JetBrains/kotlin-native/blob/master/INTEROP.md - вот этого не видел)
ttldtor
а чего такого вкотлине есть, чего нет, например в скале, шарпе, ди?