Страниц: [1]
  Печать  
Автор Тема: Параметр с пустой строкой в spawnv и getopt  (Прочитано 4165 раз)
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« : Сентября 05, 2011, 01:04:00 pm »

Добрый день, уважаемые.

Хотелось бы прояснить следующий вопрос:
Есть вызов некоторой программы через spawnv() с формированием списка аргументов, в котором один (но не последний) параметр есть пустая строка.
В запускаемой программе для парсинга параметров используется вызов getopt() и на параметре, который есть пустая строка он возвращает "-1". Что интерпретируется как конец списка параметров.
А вопрос в следующем: корректно ли вообще передавать пустые строки параметров в spawnv() и если да, то как их перешагнуть в getopt()?
Записан
@nger
Гость
« Ответ #1 : Сентября 05, 2011, 02:49:27 pm »

Попробуйте в коммандной строке передать утилите пустую строку.

Под пустой строкой понимаете: "\0" или "\n"?
« Последнее редактирование: Сентября 05, 2011, 02:52:33 pm от @nger » Записан
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #2 : Сентября 05, 2011, 02:58:19 pm »

Не совсем ясно как в командной строке это сделать, т.к. пробельные символы игнорируются.
Под пустой понимается "\0".
Если выполнить "sin arg" для запущенного процесса, то видно лишний пробел между параметрами, но запуская руками (через консоль) с таким же пробелом пустой параметр не наблюдается в getopt().
Записан
oder
Гость
« Ответ #3 : Сентября 05, 2011, 05:51:05 pm »

В командной строке параметр можно брать в двойные кавычки.
tool arg1 "" arg3 "arg 4"
Записан
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #4 : Сентября 06, 2011, 12:14:44 pm »

С двойными кавычками getopt() ведет себя так же, как и с пустой строкой при передаче в spawnv.
Т.е. возвращает "-1", что считается признаком окончания списка параметров.
Стало быть передавать пустые строки в getopt() нельзя. Собственно, это вытекает из:
Цитировать
If, when getopt() is called, argv[optind] is NULL, *argv[optind] is not the character '-', or argv[optind] points to the string "-", getopt() returns -1 without changing optind. If argv[optind] points to the string "--", getopt() returns -1 after incrementing optind.
Ещё не ясно, что за "расширенные" опции могут быть у getopt():
Цитировать
The QNX getopt() has a concept of "normal" options versus "extended" options. The presence of two consecutive asterisks (**) in optstring separates the "normal" from the "extended" options. The "**" is otherwise ignored (that is, "*" does not become an option when this is used). getopt() looks for the environment variable POSIX_STRICT. If found, the extended options are disabled.
Записан
Страниц: [1]
  Печать  
 
Перейти в: