Возможно ли разветвить процесс снаружи от него?

#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, в этот момент … получайте удовольствие).