Итак, я могу запустить свою программу и все такое, но если мне дадут
$ ./a.out -f Text.txt
Я просто не уверен, как заставить программу установить соединение, которое -f указывает на файл. Какова логика для этого?
Итак, я могу запустить свою программу и все такое, но если мне дадут
$ ./a.out -f Text.txt
Я просто не уверен, как заставить программу установить соединение, которое -f указывает на файл. Какова логика для этого?
Функция main
имеет сигнатуру int main(int argc, char**argv)
; поэтому вы можете использовать аргументы argc
(что положительно) и argv
. Массив argv
гарантированно содержит argc+1
элементов. Последнее всегда NULL
. Остальные - ненулевые строки без псевдонимов, оканчивающиеся нулевым байтом. Обратите внимание, что часто некоторая оболочка является подстановка аргументов перед запуском вашей программы с помощью execve(2): см. glob(7).
Например, если вы набираете (в терминале Linux) myprog -i a*.c -o foo.txt
и если в данный момент вы набираете, оболочка расширилась (по подстановка) a*.c
в a1.c
и a2.c
(поскольку это единственные файлы, имена которых начинаются с a
и имеют суффикс .c
в текущем каталоге), ваша myprog
исполняемая main
программа вызывается с
argc==6
argv[0]
, содержащий "myprog"
(чтобы вы могли проверить это strcmp(argv[0],"myprog") == 0
)argv[1]
содержит "-i"
argv[2]
содержит "a1.c"
argv[3]
содержит "a2.c"
argv[4]
содержит "-o"
argv[5]
содержит "foo.txt"
argv[6]
является указателем NULL
Кроме того, вы гарантированно (ядро выполняет execve(2)), что все 6 argv
указателей различны, не имеют алиасинга и не перекрываются.
GNU libc предоставляет вам несколько способов проанализируйте эти аргументы: getopt & argp. getopt стандартизирован в POSIX (но GNU также предоставляет очень полезный getopt_long(3))
Я настоятельно рекомендую вам следовать соглашениям GNU: принять как минимум --help
и --version
Тот факт, что, например. -f
используется для некоторых опций, а не имя файла часто является обычным (но см. использование --
в аргументах программы). Если вам действительно нужен файл с именем -f
(что очень плохая идея), используйте ./-f
Некоторые оболочки имеют автозаполнение. Вам нужно настроить их для этого (и вы можете настроить их даже для своих собственных программ).