Почему именно uname -m сообщает о неверной архитектуре при запуске от Sun Grid Engine (SGE)?

У меня есть 64-битные системы Debian Squeeze, на которых установлена ​​более старая 32-битная версия SGE execd. Когда я бегу uname -m в командной строке я получаю то, что ожидаю: x86_64, Но когда я бегу uname -m внутри сценария SGE на том же хосте вывод i686, Это нарушает все, что зависит от правильного прочтения uname -m,

Я могу обойти эту проблему, поэтому мой вопрос скорее академический, чем практический. Я загрузил исходный код uname, но не смог найти, откуда он берет данные об архитектуре машины. Я предполагаю, что эта проблема возникает потому, что uname -m запускается 32-битным родительским процессом вместо 64-битного родительского процесса. Итак, мой вопрос - верно ли это предположение, и если да, то почему на uname влияет архитектура процесса, который его выполняет?

1 ответ

Решение

uname -m используется для сообщения personality(2) "виртуальной машины", выполняющей код. Поскольку ядро ​​может запускать код с разными личностями (скажем, 32-разрядный код на 64-разрядной машине, дополненный "только" 32-разрядным адресным пространством или короткими inode, различными номерами сигналов или аналогичными ограничениями), программы могут использовать вывод uname -m определить, как они должны работать - то есть, какие интерфейсы ядра они получат во время выполнения.

Поэтому важно, чтобы uname -m отражать личность, а не весь объем оборудования.

Возможно, вы можете вставить вызов setarch(8) или же personality(2) в ваше программное обеспечение до fork(2)exec() вашей uname -m командные и последующие вспомогательные программы.

Другие вопросы по тегам