Можно ли развить процесс снаружи от него? - PullRequest
2 голосов
/ 12 мая 2011

Ну, очевидно, допустим, у нас есть два процесса A и F. F хочет выполнить форк A, когда у него есть управление процессором (а A приостановлено, поскольку процессор включен F).

У меня есть Google, но ничего похожего не появилось. Возможно ли такое в среде Unix?

Ответы [ 5 ]

2 голосов
/ 12 мая 2011

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

1 голос
/ 12 мая 2011

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

Как именно вы думаете, что вы хотите сделать, должно работать?

1 голос
/ 12 мая 2011

Не думаю, что это хорошая идея, но процесс F может подключиться к A с помощью интерфейса отладчика, например ptrace. Делать что-то вроде приостановки целевого процесса, сохранения его состояния, перенаправления процесса на выполнение fork, а затем восстановления его исходного состояния.

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

1 голос
/ 12 мая 2011

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

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

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

http://www.freebsd.org/cgi/man.cgi?query=cpuset&apropos=0&sektion=0

1 голос
/ 12 мая 2011

Нет, это невозможно.

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

...