C/C++

Linux перекрëстное исполнение

Нужно из исполняемого файла запустить другой исполняемый файл который находится в предыдущих директориях.
Как это сделать?
Исполняемый файл из плюсов запускается вызовом system() (на худой конец, есть и другие способы).
Относительные пути наверх - подъем на один уровень вверх по дереву осуществляется добавлением к пути "..".

Т.е. system("../mybin") должен выполнить файл mybin, находящийся на один уровень выше рабочего каталога. Обратите внимание, что рабочий каталог может оказаться в произвольном месте системы, далеко не там, где находится запускаемый бинарник. Путь к бинарнику получают, например, вызовом readlink через ссылку proc/self
 readlink("/proc/self/mybin", path, PATH_MAX); 
Дима Смирнов
Дима Смирнов
30 169
Лучший ответ
A053Amp Aa На худой конец????? Ндаааа......
прямой путь указать - не судьба?
NB
Nikolaj Bogudskij
23 562
Дима Смирнов Исполняемые файлы, размещённые в директории пользователя могут находится в произвольных положениях и прямой путь к ним может быть неизвестен
У вас в одном вопросе фактически два вопроса. Причем один из них очень криво сформулирован. Что такое "предыдущие директории"? Если имеется ввиду путь выше к корню, то, как верно было указано выше, можно воспользоваться двумя точками для указания вышестоящего каталога. ОДНАКО, если слово безопасность не является для вас пустым звуком, лучше всегда использовать абсолютные пути для запуска каких-либо программ. Это не значит, что данный путь нужно жестко прописывать в коде, корень этого пути можно получать из конфигурационного файла или из параметров командной строки и потом, на его основе, формировать полный путь к исполняемому файлу.

Теперь по самому запуску. Фактически запуск программы на выполнение происходит при помощи функции execve (либо надстройки над ней из семейства exec). При этом текущий образ процесса полностью замещается новым, однако многие ресурсы (например открытые файловые дескрипторы, если не было принято специальных мер) наследуются новым процессом. Поэтому, если нужно чтобы текущая программа существовала параллельно с запущенной, вызову exec предшествует вызов fork, создающей полную копию текущего процесса. Родительский процесс может отслеживать статус процесса-потомка при помощи функций типа wait или waitpid. Вышеупомянутая функция system - это высокоуровневая надстройка, которая делает эти вещи внутри себя. Причем system выполняет программу путем запуска оболочки (shell). С одной стороны, это дает возможность выполнять всякие скрипты, но, с другой стороны, на все эти телодвижения тратятся лишние ресурсы и время. На мой взгляд system - это одна из самых бестолковых функций, потому что обычно требуется какое-то взаимодействие с запущенным процессом, а при помощи system вы можете разве что узнать код завершения запущенной программы.