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

Поскольку https://stackoverflow.com/a/51329983/6656422 указывает, что во время выполнения во время выполнения нет типов TypeScript. Вы должны проверить «тип». Чтобы сделать что-то общее, вы можете пройти в тесте.

function getLeftOrDefault(either: A | B, backup: A, isA: (obj: any) => obj is A): A {
  if (isA(either)) {
    return either;
  }
  return backup;
}

Использование:

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

interface Car {
  engine: string;
}

interface Tree {
  branches: any[];
}

function isCar(obj: any): obj is Car {
  return !!obj.engine;
}

const myCar: Car = { engine: '350' };
const myTree: Tree = { branches: [] };
const myBackup: Car = { engine: '396' };

getLeftOrDefault(myCar, myBackup, isCar); // -> { engine: '350' }
getLeftOrDefault(myTree, myBackup, isCar); // -> { engine: '396' }

Если ваши типы являются классами, у них есть конструкторы во время выполнения.

class Car {
  constructor(public engine: string) {}
}

class Tree {
  constructor(public branches: any[]) {}
}

function isCar(obj: any): obj is Car {
  return obj instanceof Car;
}

const myCar: Car = new Car('350');
const myTree: Tree = new Tree([]);
const myBackup: Car = new Car('396');

getLeftOrDefault(myCar, myBackup, isCar); // -> { engine: '350' }
getLeftOrDefault(myTree, myBackup, isCar); // -> { engine: '396' }

Однако проверка конструктора не является доказательством дурака из-за литья

const myCar: Car = { engine: '350' };
const myTree: Tree = { branches: [] };
const myBackup: Car = { engine: '396' };

getLeftOrDefault(myCar, myBackup, isCar); // -> { engine: '396' }
getLeftOrDefault(myTree, myBackup, isCar); // -> { engine: '396' }

1
задан Jonathan Leffler 19 January 2019 в 01:26
поделиться

2 ответа

Да, это возможно. Например, Операционная система Linux предоставляет ptrace системные вызовы, с помощью которых вы можете не только просматривать, но и изменять память трассировки. Из ptrace [выделение добавлено]:

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

0
ответ дан H.S. 19 January 2019 в 01:26
поделиться

Возможно, да, но не гарантировано.

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

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

Операционные системы предоставляют различные средства для разработки и отладки. В Linux и BSD (изначально из Unix System V) интерфейс ptrace , вероятно, является самым мощным. В общем, интерфейс работает между процессами, работающими под одним и тем же идентификатором пользователя, и требует использования привилегий суперпользователя для использования в противном случае. (В Linux, в зависимости от конфигурации ядра, также может быть возможно манипулировать содержимым памяти, которое каждый процесс видит напрямую, через /proc/PID/mem. Это также имеет аналогичные соображения безопасности.)

В Linux процесс может Звоните prctl(PR_SET_DUMPABLE, 0uL) , чтобы сделать себя и своих детей недостижимыми. Это часто встречается, например, когда привилегированная служба запускает вспомогательный процесс, который делает что-то от имени непривилегированного пользователя, но этот вспомогательный процесс должен быть защищен от манипуляций этим пользователем (например, вспомогательный процесс возвращает некоторые привилегированные данные, которые пользователь должен не сможет подделать или подделать).

(Фактически, если процесс меняет свою идентичность посредством seteuid(), setegid(), setfsuid(), setfsgid() или связанных вызовов, или процесс был выполнен как двоичный файл setuid / setgid, или получил дополнительный возможности, основанные на возможностях файловой системы для своего двоичного файла, ядро ​​автоматически делает эквивалент вызова вышеупомянутого prctl (), запрещая трассировку таких процессов.)

Динамический компоновщик в Linux также может использоваться для вставки или вставки кода в любой (не setuid / setgid / gaining -abilities) процесс, который запускает пользователь, путем указания путей к этим дополнительным динамическим библиотекам в переменной среды LD_PRELOAD. Это позволяет такие вещи, как замена стандартных функций библиотеки C вашими собственными обертками. Формат исполняемого файла ELF также поддерживает «конструкторы» и «деструкторы»; функции, которые автоматически вызываются при выполнении и выходе двоичного файла (то есть до и после main()). Они позволяют вам по существу внедрить небольшую службу в любые процессы, которые вы запускаете (которые выполняются с вашей собственной учетной записью пользователя и вашими привилегиями пользователя), к которым вы можете удаленно подключаться и наносить вред процессу, например перенаправлять файлы или изменять сохраненные данные. по некоторым адресам памяти.

Как видите, лучше задать вопрос , как и , когда один процесс может изменить значение переменной в другом процессе во время выполнения. И ответ на это зависит от ситуации. Наиболее распространенным случаем является взаимодействие двух процессов - межпроцессное взаимодействие - так, чтобы целевой процесс фактически вносил изменения, когда другой пользователь попросил об этом. Решения варьируются в зависимости от конкретной ситуации - и используемой ОС, конечно; Мой ответ здесь специфичен для Linux, но подобные или связанные функции доступны во всех операционных системах, они просто немного отличаются.

0
ответ дан Nominal Animal 19 January 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: