K&R: Упражнение 7-1 - Как это вызвать?

Упражнение 7-1. Напишите программу, которая преобразует верхний регистр в нижний или нижний в верхний, в зависимости от имени, с которым она вызывается, как указано в argv [0].

Те из вас, кто заинтересован в написании программы, могут найти здесь примеры решений: http://users.powernet.co.uk/eton/kandr2/krx701.html

Мой вопрос, однако, заключается в том, как именно вызвать программу? argv [0] относится к имени программы, но в дополнение к пути к файлу программы. Когда я выполняю printf () для argv [0], он выводит полный путь из / home, если я запускаю программу через IDE code :: blocks. Если я пытаюсь выполнить программу через командную строку с './upper' (без кавычек), argv [0] включает './' перед именем программы.

Есть ли способ вызвать эту программу БЕЗ добавления пути к программе в переменную среды PATH?


person AK-33    schedule 18.12.2011    source источник
comment
Вы делаете это как домашнее задание? Какая у вас целевая платформа (windows, linux и т. Д.)?   -  person M.Babcock    schedule 18.12.2011
comment
Это не домашнее задание - сейчас я кодирую только как хобби. Моя платформа - это виртуальная машина Arch Linux. Кодирование в Windows (без эмулятора * nix, такого как Cygwin) вызывает слишком много проблем.   -  person AK-33    schedule 18.12.2011
comment
Понятно, просто API Microsoft позволяют вам определять рабочий каталог, что упрощает ваш вопрос. Вероятно, есть что-то подобное в мире * nix, с которым мне еще не приходилось сталкиваться.   -  person M.Babcock    schedule 18.12.2011


Ответы (5)


Вы можете скомпилировать его один раз, независимо от имени выходного файла (например: my_c_program) и с bash, используйте:

$ exec -a upper ./my_c_program
foo
FOO

$ exec -a lower ./my_c_program
BAR
bar

Если вы хотите, чтобы он запускался в отдельной оболочке:

$ bash -c "exec -a upper ./my_c_program"

По сути, это синтаксис exec -a <newname> <command>, где <newname> будет argv[0].

person netcoder    schedule 18.12.2011
comment
Что произойдет, если приложение будет запущено с полным путем из несвязанного каталога? - person M.Babcock; 18.12.2011
comment
@ M.Babcock: он все еще работает, пока передан переключатель -a. - person netcoder; 18.12.2011

Можете ли вы просто просканировать строку на предмет последнего символа / и использовать все символы с этого момента?

person Gravity    schedule 18.12.2011
comment
Я не совсем понимаю, что вы имеете в виду. Вы можете привести пример? - person AK-33; 18.12.2011

Обычно argv[0] в точности отражает то, что вы вводите в командной строке для выполнения программы. Если ваша программа находится в каталоге, включенном в переменную среды PATH, вам не нужно указывать имя каталога с ./ или полным путем.

Однако даже если ваша программа находится в каталоге PATH, пользователь все равно может ввести полный путь к исполняемому файлу. Ваша программа должна быть готова к этому.

Дополнительную информацию о переменной среды PATH и о том, как ее изменить, см. В документации по оболочке.

person Greg Hewgill    schedule 18.12.2011

Взгляните на этот ответ. В нем обсуждается использование стандартного метода Posix для определения текущего рабочего каталога для вашего приложения, что вам нужно для определения местоположения вашего исполняемого файла. В основном определить, является ли путь абсолютным путем, и если он, то выполнить как есть, если это не так (после проверки, чтобы увидеть, что терминатор пути находится на arg [0]), добавьте arg [0] к текущему рабочий каталог, а ОС должна решить все остальное (я считаю, прошло несколько лет с тех пор, как я сделал серьезный * nix dev).

person M.Babcock    schedule 18.12.2011

Вы можете написать небольшую оболочку вокруг execv(3), которая выполняет за вас выполнение с правильными аргументами:

char *args = {"Uppercase", NULL};

execve("/path/to/your/Uppercase", args);

Или вы можете сделать свою программу более гибкой в ​​том, как она анализирует argv[0]; см. strrchr(3), чтобы узнать, как легко перейти к имени вашей программы, если указана часть каталога.

person sarnold    schedule 18.12.2011