die Frage ist ziemlich klar, frage ich mich, weil der Mann sagtFunktionieren C getopt und getopt_long nur für Hauptargumente?
Die getopt() Funktion, um die Befehlszeilenargumente analysiert.
Und ich versuche es mit einer anderen Funktion zu verwenden, die die gleiche Signatur wie der Haupt hat und die argc
und argv
erhalten werden, mit wordexp
so every scheint die gleichen, aber wenn getopt Aufruf erhalte ich einen Segmentierungsfehler unmittelbar nach getopt_long aufrufen.
#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;
}
}
[...]
Es könnte sein, dass, aber wenn so frage ich mich, warum es so ist auch, warum sollten wir die argc
und argv
-getopt
(_long
) übergeben.
Vielen Dank.
Die einzige Annahme, die nicht oft angegeben wird, ist, dass Sie 'getopt()' et al konsistent mit den gleichen Werten für 'argc' und' argv' aufrufen, anstatt die Liste bei jedem Aufruf zu ändern. Wenn Sie 'getopt()' verwenden, um Befehlszeilenargumente zu verarbeiten, und sie anschließend verwenden, um auf andere Argumente zuzugreifen, könnten Sie Probleme bekommen. Machst du so etwas? (Im Prinzip gibt es keine Vorkehrungen für Nebenläufigkeit - es ist nicht Thread-sicher - und es gibt keine Vorkehrung für die Wiederverwendung. Es gibt normalerweise eine halb-undokumentierte Möglichkeit, das System so neu zu starten, aber es variiert.) –
Keine Anrufe an 'getopt' kommen aus dem gleichen Thread und werden sequentiell ausgeführt. –