de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 MetallicPriest
MetallicPriest
Вопрос

Восстановить мертвые потоки после вилки

Как вы, возможно, знаете, все потоки в приложении умирают в разветвленном процессе, кроме потока, делающего вилку. Тем не менее, я планирую повторить эти потоки в разветвленном процессе, вызвав pthread_create и используя pthread_attr_setstack , чтобы назначить вновь созданные потоки тем же самым стекм, что и мертвые потоки. Что-то вроде следующего.

// stackAddr and stacksize taken from the dead thread    
pthread_attr_setstack(&attr, stackAddr, stacksize);
rc = pthread_create(&thread, &attr, threadRoutine, NULL); 

Тем не менее, мне все равно нужно получить значения регистров процессора, такие как указатель стека, указатель базы данных, указатель инструкций и т. Д., Для перезапуска потоков из одной и той же точки. Как я могу это сделать? И что еще мне нужно сделать, чтобы успешно достичь моей цели?

Также обратите внимание, что я использую 64-битную архитектуру. Какие дополнительные трудности у него будут по сравнению с 32-битными?

7 2011-10-27T15:42:22+00:00 3
 MetallicPriest
MetallicPriest
Редактировал вопрос 27-го октября 2011 в 3:47
Программирование
linux
c
fork
x86
64-bit
ninjalj
27-го октября 2011 в 6:12
2011-10-27T18:12:21+00:00
Дополнительно
Источник
Редактировать
#56790235

Я вижу два возможных способа стрелять себе в ногу и терять волосы. W: W ^ W ^ W ^ W ^ W ^ W ^ Wtry сделать это:

  • Попробуйте заставить каждый поток вызывать getcontext () перед fork () , а затем восстанавливать контекст каждого потока через setcontext () . Наверное, это не сработает, но вы можете попробовать развлечься.
  • Сохранить ptrace (PTRACE_GETREGS) , ptrace (PTRACE_GETFPREGS) и восстановить с помощью ptrace (PTRACE_SETREGS) , ptrace (PTRACE_SETFPREGS) .
3
0
Chris Dodd
27-го октября 2011 в 6:17
2011-10-27T18:17:02+00:00
Дополнительно
Источник
Редактировать
#56790236

Другие потоки текущего процесса не будут уничтожены вилкой - они все еще существуют и работают в родительском. Проблема, с которой вам кажется, заключается в том, что fork только разворачивает поток SINGLE в текущие процессы, создавая новый процесс с одним потоком с копией всех ресурсов, отличных от потока, в родительском.

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

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

К сожалению, интерфейс POSIX pthread безнадежно неопределен и не дает никакого способа сделать это. В частности, в нем отсутствует какой-либо отражающий интерфейс, позволяющий выяснить, какие потоки фактически выполняются.

Если вы все равно попытаетесь сделать это, я вижу два способа попытаться приблизиться к этому:

  • выкарабкается в/proc/self/task, чтобы выяснить, какие потоки выполняются в вашем процессе, эффективно используя этот отражающий интерфейс очень не переносимым образом. Вероятно, в конечном итоге вам придется использовать (2) другие потоки, чтобы получить их внутреннее состояние. Это будет очень сложно.

  • оберните библиотеку pthreads - вместо того, чтобы напрямую использовать библиотеку, перехватите каждый вызов и отслеживайте все созданные потоки/мьютексы/блокировки, чтобы у вас была доступная информация, если вы хотите использовать fork. Это будет работать нормально, если вы не хотите использовать сторонние библиотеки, которые используют pthreads

Второй вариант намного проще (и несколько портативен), но работает только хорошо, если у вас есть доступ ко всему исходному коду всего вашего приложения и его можно модифицировать для правильной работы ваших обертков.

2
0
Kevin
27-го октября 2011 в 6:32
2011-10-27T18:32:16+00:00
Дополнительно
Источник
Редактировать
#56790237

Просто гуглинг вокруг я обнаружил, что солярис имеет вызов forkall (), который делает именно то, что вы хотите, см. Документацию здесь:

http://download.oracle.com /docs/cd/E19963-01/html/821-1601/gen-1.html

Я предполагаю, что вы работаете в Linux, но можно запустить solaris на оборудовании x86. Так что, возможно, это вариант для вас.

0
0
Похожие сообщества 21
DevOps — русскоговорящее сообщество
DevOps — русскоговорящее сообщество
14 586 пользователей
Общаемся на темы DevOps, мониторинга, метрикам и облакам. Новости. См. также: @kubernetes_ru, @docker_ru, @ceph_ru, @openstack_ru FAQ и правила: https://git.io/JtnWb Вакансии и поиск работы: @devops_jobs
Открыть telegram
DevOps Jobs - работа и аналитика
DevOps Jobs - работа и аналитика
11 677 пользователей
Публикуем вакансии и запросы на поиск работы по направлению DevOps & SRE. Обмен инсайдами и аналитикой на рынке труда DevOps & SRE. FAQ и правила: https://git.io/JtnWb Старт бота "/man" См.также: @devops_ru, @kubernetes_ru, @qa_jobs, @javascript_jobs
Открыть telegram
Linux Help
Linux Help
4 594 пользователей
Правила: https://t.me/grouplinux/1471022 Linux Flood: @grouplinuxflood VFIO: @vfiolinux
Открыть telegram
Системное администрирование
Системное администрирование
3 521 пользователей
Чат посвящён любым вопросам системного администрирования. Создан и поддерживается автором сайта - https://serveradmin.ru Анонсы новых материалов сайта в отдельном канале - https://t.me/srv_admin Правила - https://t.me/srv_admins/810640
Открыть telegram
🐧 RU.UBUNTU — Официальное сообщество пользователей Ubuntu Linux
🐧 RU.UBUNTU — Официальное сообщество пользователей Ubuntu Linux
3 518 пользователей
Сообщество пользователей Ubuntu ⚠️ Правила: https://t.me/ru_ubuntu/494413 Флудилка: https://t.me/+5NcAd5BEwnA4NTVi Список групп и каналов: https://github.com/goq/telegram-list
Открыть telegram
Альт Линукс
Альт Линукс
3 033 пользователей
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 4 дня назад
2
Hideo Nakagawa
Зарегистрирован 5 дней назад
3
Sergiy Tytarenko
Зарегистрирован 1 неделю назад
4
shoxrux azadov
Зарегистрирован 1 неделю назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией