I do not see any serious problems if you use a version of getopt() that is acceptable for POSIX.
Source Code ( goo.c )
#include <stdio.h> #include <stdlib.h> #include <unistd.h> /* ./main trace_file 8 12 # (only necessary arguments) ./main –n 3000000 –p page.txt trace_file 8 7 4 # (with optional arguments) */ static void usage(const char *argv0) { fprintf(stderr, "Usage: %s [-n number][-p pagefile] trace n1 n2 ...\n", argv0); exit(EXIT_FAILURE); } int main(int argc, char **argv) { int number = 0; char *pagefile = "default.txt"; char *tracefile; int opt; while ((opt = getopt(argc, argv, "n:p:")) != -1) { switch (opt) { case 'p': pagefile = optarg; break; case 'n': number = atoi(optarg); break; default: usage(argv[0]); } } if (argc - optind < 3) { fprintf(stderr, "%s: too few arguments\n", argv[0]); usage(argv[0]); } tracefile = argv[optind++]; printf("Trace file: %s\n", tracefile); printf("Page file: %s\n", pagefile); printf("Multiplier: %d\n", number); for (int i = optind; i < argc; i++) printf("Processing number: %d (%s)\n", atoi(argv[i]), argv[i]); return 0; }
Compilation
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \ > -Wold-style-definition -Werror goo.c -o goo
Execution example
$ ./goo trace_file 8 12 Trace file: trace_file Page file: default.txt Multiplier: 0 Processing number: 8 (8) Processing number: 12 (12) $ ./goo -n 3000000 -p page.txt trace_file 8 7 4 Trace file: trace_file Page file: page.txt Multiplier: 3000000 Processing number: 8 (8) Processing number: 7 (7) Processing number: 4 (4) $
source share