Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > c++ shell


Автор: Soeti 23.7.2010, 10:08
Начал изучать с++, но под линухом. Скачал пару книг, но как оказалось в них ничего нет по программированию shell

Типичная проблема: написать клон команды cd.
Простым setenv()  изменить параметр PWD не получается. Вычитал, что поскольку я нахожусь в шеле, то такой вариант в лоб не катит и нужно учиться работать с шелом.
Подскажите литературу, где можно прочитать про программирование на c++ под шелл.

Автор: djamshud 23.7.2010, 18:37
Когда вы запускаете программу, в ней создается свой environ (переменные окружения) - копия родительского (этим занимается системный вызов exec, если мне память не изменяет). Таким образом setenv изменяет только свой environ. Аналогично chdir изменяет текущую директорию своего процесса, а не родительского bash-а.

Изменить environ родительского процесса нельзя.

Добавлено через 5 минут и 22 секунды
С другой стороны, можно попробовать расковырять исходники bash-а и посмотреть, как в нем устроено межпроцессное взаимодействие, благодаря которому дочерний процесс посредством bash-команды export передает переменную в родитеский процесс.

Автор: Tima22 25.7.2010, 01:23
никакя книга не содержит полной информации - тебе надо man pages твоей системы. Например для free bsd это http://www.freebsd.org/cgi/man.cgi - вводишь команду и смотришь как использовать. Если есть конкретная постановка задачи, можеши поискать соответсвующею команду в интернете или спросить здесь.

p.s. Процесс что создаёт копию называется fork, а потом уже изменяется с помошью exec "семьи"

Автор: sdukshis 28.7.2010, 20:36
Для смены текущего каталога в POSIX предусмотрен соответствующий вызов:
Код

#include <unistd.h>

int chdir(const char *path);

http://www.opengroup.org/onlinepubs/009695399/functions/chdir.html

По поводу литературы: если работаете с POSIX, то лучшее, что могу порекомендовать это Стивенс: UNIX Профессиональное программирование http://www.books.ru/shop/books/503720

Автор: bsa 29.7.2010, 23:32
Цитата(sdukshis @  28.7.2010,  21:36 Найти цитируемый пост)
Для смены текущего каталога в POSIX предусмотрен соответствующий вызов:

меняет каталог текущего процесса, а не родительского. А команда cd меняет каталог шелла, т.е. если бы она была программой, то меняла бы каталог родителя.

Автор: MAKCim 31.7.2010, 08:47
djamshud, 
Ковырять ничего не надо, есть системный вызов execve (man 2 execve)

кроме всего прочего он принимает параметр - адрес массива строк переменных окружения

через export bash помечает переменную окружения как экспортируемую и при порождении процесса копирует ее в массив, передаваемый дальше в execve третьим параметром

Автор: djamshud 31.7.2010, 14:49
MAKCim, я ступил. Думал, при export дочерний bash меняет переменную в родителе.

В таком случае видимо нет нехакерского способа изменить текущее положение в файловой системе (pwd) баша своей программой. Как я понял, ТС именно это нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)