вопрос довольно ясен, интересно, потому что человек говорит
Функция getopt() анализирует аргументы командной строки.
И я пытаюсь использовать его с другой функцией, которая имеет ту же сигнатуру, что и основная, а argc
и argv
получаются с wordexp
, поэтому все кажется таким же, но при вызове getopt я получаю ошибку сегментации сразу после вызова getopt_long.
#define OPT_HELP 'h'
#define OPTL_HELP "help"
#define OPT_MESS 'm'
#define OPTL_MESS "message"
#define OPT_STRING "hm:"
struct option longopts[] = {
{OPTL_HELP, no_argument, 0, OPT_HELP},
{OPTL_MESS, required_argument, 0, OPT_MESS},
{0, 0, 0, 0}
};
#define FLAG_MESS 1
void cmd_chat(int argc, char **argv)
{
int c, indexptr;
short flag = 0;
char message[481];
while ((c = getopt_long(argc, argv, OPT_STRING,
longopts, &indexptr)) != -1) {
debug(MAGENTA "cmd_chat", MAGENTA "c value: %d", c);
switch (c) {
case OPT_HELP:
debug(MAGENTA "cmd_chat", MAGENTA "calling help");
help(argv[0]);
return;
break;
case OPT_MESS:
flag |= FLAG_MESS;
strncpy(message, optarg, 481);
break;
default:
usage(argv[0]);
break;
}
}
[...]
Возможно, это так, но если да, то мне интересно, почему это так, а также почему мы должны передавать argc
и argv
в getopt
(_long
).
Спасибо.
getopt()
и др. последовательно с одними и теми же значениями дляargc
иargv
, а не меняете список при каждом вызове. Если вы используетеgetopt()
для обработки аргументов командной строки, а затем используете его для доступа к какому-то другому набору аргументов, вы можете — не обязательно обязательно — столкнуться с проблемами. Вы делаете что-нибудь подобное? (По сути, параллелизм не предусмотрен — он не ориентирован на многопотоковое исполнение — и нет возможности для повторного использования. Обычно существует полунедокументированный способ перезагрузки системы, чтобы она начиналась заново, но он бывает разным.) - person Jonathan Leffler   schedule 21.04.2016getopt
не исходят из одного и того же потока и поэтому выполняются последовательно. - person Nicolas Scotto Di Perto   schedule 21.04.2016