linux c「struct option」解析コマンドパラメータ
4887 ワード
cプログラムアプリケーションで実行される場合、パラメータが少ない場合はarvg、arvcを使用して実装することができ、パラメータが多く、パラメータが複雑である必要がある場合はstrcut optionを使用して実装することができます.
1.struct optionの紹介
}
2. getopt_long紹介
3.コード例
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;
}