В рамках небольшого проекта я пишу оболочку на Аде. Таким образом, когда я исследовал системные вызовы, я узнал, что есть три способа сделать это.
- Системные вызовы POSIX, которые, вероятно, наименее надежны.
- Передача аргументов в system() C, чего я на самом деле не хотел делать, так как речь шла о написании эмулятора на Аде, а не на C.
- Использование библиотек времени выполнения GNAT.
Я выбрал последний вариант, считая его наиболее «похожим на Аду». Я нашел фрагмент кода на RosettaCode здесь. Я скопировал и вставил его и скомпилировал после изменения «cmd.exe» на «ls» и удаления определения второго аргумента. Однако ничего не происходит, когда я запускаю исполняемый файл. Оболочка просто возвращается к подсказке. Я проверил это на двух разных компьютерах, на одном была установлена Fedora 21, а на другом — Debian Jessie. Вот что я сделал, чтобы проверить это:
- Видно, если это вызвано отсутствием строки аргументов
- Проверено, если какой-либо из файловых дескрипторов в библиотеках GNAT назван неправильно.
- Перенаправил и stderr, и stdin на stdout, просто чтобы посмотреть, не сбрасывает ли GNAT их в неправильный FD.
- Просмотрел досконально файл библиотеки System.OS_lib, и вроде бы нет причин.
- Погуглил, но собственная страница GNAT на сайте GCC очень плохо документирована.
Пока что я использую систему C.Interface при подготовке своей оболочки, но я этим недоволен. Я новичок в Аде и возился с ней всего месяц или около того, поэтому, если здесь есть какая-то мудрость Ады, которая могла бы помочь, я не в этом.
ОБНОВЛЕНИЕ: я попытался запустить его с абсолютным путем, как в /usr/bin, так и в /bin, и это не сработало. Интересно, что операционная система возвращает код результата 1, но я не знаю, что это значит. Быстрый поиск показывает, что это «все общие ошибки», а другой сайт предполагает, что это «неправильные функции».