linux c「struct option」解析コマンドパラメータ

4887 ワード

cプログラムアプリケーションで実行される場合、パラメータが少ない場合はarvg、arvcを使用して実装することができ、パラメータが多く、パラメータが複雑である必要がある場合はstrcut optionを使用して実装することができます.
1.struct optionの紹介
struct option {
const char *name; //name        
int has_arg;
//has_arg 3  ,no_argument(   0),            
// required_argument(   1),               
// optional_argument(   2),          ,        
int *flag;    
//    ,getopt_long()         。       NULL,  getopt_long()     val      。       NULL,getopt_long()             val      ,  getopt_long()  0。  flag  NULL,       ,              。
int val;    
// flag                       ,  flag   NULL   *flag   。     , flag  NULL,  val   /  ,  1  0;    ,   flag NULL,  val       ,          ,          optstring             。

}
2. getopt_long紹介
1、getopt_long          ,argc、argv   main        。   '-'           ,getopt_long          option,      ,   argv    option    ;
2、 getopt_long     ,        getopt_long  ,        argv  ;
3、 getopt_long   -1,  argv[]          ,optind         argument  ;     , getopt_long           argument   argv     ,option    , :cmd -a file1 -b file2,  a/b         ,   argv    :cmd -a -b file1 file2;
4、optstring         ,          ,        ':'          ,      ':'          (      ),    ,optarg      ,  optarg 0;
5、    getopt_long    argv     ,        optstring      ,     :
 1)   optstring       '+'  POSIXLY_CORRECT   , getopt_long   argv               -1;
 2)   optstring       '-',              ,    1,     1     ;
6、  getopt_long           ,           stderr ,        optopt ,  '?';        opterr=0         ;  :         ,optstring      (         +/-  )   ':',         ;
7、  optstring    option    ,         ,  getopt_long    '?',   optstring      (         +/-  ) ':',     ':';

3.コード例
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "client.h"
#include "server.h"
int FRAME_PER_PACKET = 0;
static struct option long_options[] = {
{ "server", 0, 0, 's'},
{ "client_self", 0, 0, 'c'},
{ "client_send", 0, 0, 'd'},
{ "client_recv", 0, 0, 'v'},
{ "PER_FREAM_PACKET", 1, 0, 'p'},
{ "auto test from 1 to 10", 0, 0, 'A'},
{0, 0, 0, 0},
};
static char optstring[] = "scdvp:A";

#define print_opt_help(opt_index, help_str)             \
do {                                \
    printf("\t---%s\t\t-%c\t%s", long_options[opt_index].name, (char)long_options[opt_index].val, help_str); \
} while (0)

void usage() {
    printf("
Usage:
"); print_opt_help(0, "action server
"); print_opt_help(1, "action client self send and self recv
"); print_opt_help(2, "action client send
"); print_opt_help(3, "action client recv
"); print_opt_help(4, "set PER_FREAM_PACKET num
"); print_opt_help(5, "auto test from 1 to 10
"); printf("

Examples:
"); printf("\t./net-test -s\t---\taction server
"); printf("\t./net-test -c -p 10\t---\taction client PER_FREAM_PACKET is 10
"); } int main(int argc, char *argv[]){ int c = 0; client_act client_act_t; while(1){ c = getopt_long(argc, argv, optstring, long_options, NULL); switch (c){ case 's': printf("start server
"); server_fun(); break; case 'c': printf("start client self send and recv test
"); client_act_t = RECV_AND_SEND; client_fun(client_act_t); break; case 'd': printf("start client send test
"); client_act_t = SEND_ONLY; client_fun(client_act_t); break; case 'v': printf("start client recv test
"); client_act_t = RECV_ONLY; client_fun(client_act_t); break; case 'A': printf("start client auto test
"); client_fun(client_act_t); break; case 'p': FRAME_PER_PACKET = atoi(optarg); printf("set PER_FREAM_PACKET is %d
", FRAME_PER_PACKET); break; default : usage(); return -1; } } return 0; }