#unix #fork
#unix #разветвление
Вопрос:
Ну, это очевидно, допустим, у нас есть два процесса A
и F
. F
хочет разветвить A
, когда у него есть управление процессором (и A
приостановлено, поскольку процессор включен F
).
Я погуглил, однако ничего связанного не появилось. Возможно ли такое в средах Unix?
Комментарии:
1. Можете ли вы лучше объяснить свою цель? Почему вы помещаете процесс F на картинку, в то время как кажется, что все, что вы хотите, это клонировать процесс A извне. Предположение, что только один процесс может одновременно управлять процессором, в наши дни становится довольно устаревшим.
2. Мне было просто любопытно. Разве мы не можем разветвить процесс извне этого программного кода? Дальнейшей цели нет.
3. Любопытно, что вы принимаете ответ, в котором говорится, что это невозможно, в то время как я и позже Askurtun с техническими подробностями оба ответили, что это возможно…
4. Вы правы. На самом деле я не особо задумывался об этом. Извините.
Ответ №1:
Определенно не существует стандартного и / или переносимого способа клонирования процесса извне, но в зависимости от операционной системы, безусловно, существуют возможные способы отвлечь процесс от его задачи и заставить его клонировать себя или делать все, что вы хотите.
Ответ №2:
Я не думаю, что это хорошая идея в любом случае, но может быть возможно, чтобы процесс F
подключался к A
с помощью интерфейса отладчика, такого как ptrace
. Выполнение чего-то вроде приостановки целевого процесса, сохранения его состояния, перевода процесса в режим запуска fork
, затем восстановления его исходного состояния.
Следует отметить, что вашему процессу клонирования, вероятно, потребуется обработать некоторые странные случаи, связанные с потоками и тому подобное.
Ответ №3:
Нет, это невозможно.
fork()
Системный вызов создает копию родительского, поэтому, если вы вызываете fork()
в F
процессе, дочерний процесс будет копией F
, вы ничего не можете сделать, чтобы изменить это поведение.
Комментарии:
1. Возможно, процесс какого-то
root
уровня может считывать сопоставления памятиA
, а затем создавать точно такой же код / стек / область памяти сprocess_t
. Неужели люди не могут реализовать такую вещь? Есть ли ограничение?2. @Ahmet насколько я знаю, это невозможно по соображениям безопасности, но я вообще не специалист.
Ответ №4:
Причина, по которой это невозможно, заключается в том, что, как правило, с fork()
, есть ровно одно различие для начала между двумя процессами: возвращаемое значение самого вызова fork(). Без такого вызова внутри кода A
у процессов нет возможности иметь какое-либо различие между ними, поэтому они оба будут делать точно то же самое, когда обычно вы хотите, чтобы один из процессов начал делать что-то другое.
Как именно, по вашему мнению, должно работать то, что вы хотите сделать?
Ответ №5:
Нет, это было бы огромной дырой в безопасности, которая привела бы к утечке конфиденциальной информации, если бы это было возможно.
В лучшем случае, вы могли бы настроить обработчик сигналов в родительском процессе, который разветвлял бы (2) дочерний процесс (возможно, exec(2) предварительно настроенный дочерний процесс?).
Я думаю, вам было бы лучше, если бы вы посмотрели на передачу сообщений между двумя процессами, у которых настроена привязка к процессору, но даже тогда, я думаю, выигрыш был бы номинальным (проблема чрезмерной оптимизации?).
http://www.freebsd.org/cgi/man.cgi ?запрос=набор процессоровamp;apropos=0amp;секция = 0
Комментарии:
1. Это возможно, и это не является дырой в безопасности, при условии, что процесс принадлежит вам или у вас есть права администратора. Отладчики все время проделывают подобные трюки и даже хуже. Dtrace на Solaris или FreeBSD также был бы хорошим кандидатом.
2. Правильно. Если UID совпадают, вы можете делать практически все с любым другим процессом. Если UID не совпадают, вам не разрешается (и не должно) что-либо делать (если вы не являетесь root, в этот момент … получайте удовольствие).