LINUX.ORG.RU

Qt shared memory - поиск незанятого ключа


0

1

Есть необходимость вынести обработку некоего не совсем надежного в плане сбоев кода в отдельный процесс. Как это лучше сделать? Пишу на Qt и для этого я решил использовать QSharedMemory.

Возникает вопрос - а как же сделать поиск незанятого ключа? Их должны быть два десятка. Просто пытаться создать область памяти и смотреть удалось или нет? А будет ли оно надежно в плане чтобы два процесса случайно не получили одну и ту же память под одним ключом? Я не совсем понимаю, насколько позаботились разработчики Qt от такого racing condition-а...

Или есть другие способы быстро обменяться областью памяти несколько мегабайт 5 раз в секунду + 10 в парраллель?

Сигналы SIGSEGV и SIGFPE посылаются отдельному потоку, а не процессу. Т.е. можно запустить ненадёжный код в отдельном потоке и при поимке сигнала сделать бочку (см. второй пост там).

Говорили мне как-то, что число ключей в Shared Memory во FreeBSD 98-го года было ограничено то ли восемью, то ли шестнадцатью. Так что может лучше всё-таки пайпы, если отдельным процессом.

quiet_readonly ★★★★
()

Кстати, сишный API к clang крешебезопасен, и он как раз делает бочку в упавшем потоке.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

Сигналы SIGSEGV и SIGFPE посылаются отдельному потоку, а не процессу. Т.е. можно запустить ненадёжный код в отдельном потоке и при поимке сигнала сделать бочку (см. второй пост там).

При этом память всего процесса уже может быть испорчена, поэтому так делать нельзя.

Reset ★★★★★
()
Ответ на: комментарий от Reset

да, именно так, запоров некую область памяти лишь только бессовестно выйдя за рамки будет sigsegv

I-Love-Microsoft ★★★★★
() автор топика

а оно тебе надо?? расшаренная память - не самый лучший способ, лучше попользуй что-нибудь более безопасное, например общение по сети, а чтобы было более прозрачным - RPC тебе в помощь (или CORBA, тут уж на любителя)

EugeneBas ★★
()

вынести обработку некоего не совсем надежного в плане сбоев кода в отдельный процесс.

я решил использовать QSharedMemory.

Так себе решение. Если твой «не совсем надежный код» сегфолтнется или зациклится, что станет с разделяемой памятью?

способы быстро обменяться областью памяти несколько мегабайт 5 раз в секунду + 10 в парраллель?

Скажем, 25-50 Мбайт/с? Я думаю, любой IPC, включая TCP-сокеты.

tailgunner ★★★★★
()

Есть, кстати, один трюк: готовишь данные, потом делаешь fork для выполнения «ненадежного кода», а он отдает результат через пайп (или сегфолтится, но это легко обнаруживается).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

если приложение многопоточное, то этот трюк может оказаться слишком геморройным

Reset ★★★★★
()
Ответ на: комментарий от tailgunner

это уже не важно что станет с памятью, т.к. она один раз отдается в дочерний процесс с ненадежным кодом, если всё там гикнется и потрет и эту память - совершенно всё равно, хотя этого не случится ибо происходит лишь чтение её

I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.