博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
getopt 解析
阅读量:4283 次
发布时间:2019-05-27

本文共 2589 字,大约阅读时间需要 8 分钟。

命令源码解析

//一般情况下,源码目录下会有一个Makeile,然后make之后,就能得到一些二进制文件//根据make的过程,可以判断出哪些文件被编译//在文件内,一般先定义一些变量,定义很多宏//在main函数内.//1.做初始化//2.设置设置成权限x,前提是the real user ID 是 root	uid = getuid();//returns the real user ID of the calling process.	if (setuid(uid)) {
//sets the effective user ID of the calling process perror("ping: setuid"); exit(-1); }//3.解析参数//getopt//getopt_longwhile ((ch = getopt(argc, argv, COMMON_OPTSTR "bRT:")) != EOF){
switch(ch) {
case 'b': broadcast_pings = 1; break; case 'Q': settos = parsetos(optarg); if (settos && (setsockopt(icmp_sock, IPPROTO_IP, IP_TOS, (char *)&settos, sizeof(int)) < 0)) {
perror("ping: error setting QOS sockopts"); exit(2); } break; case 'R': if (options & F_TIMESTAMP) {
fprintf(stderr, "Only one of -T or -R may be used\n"); exit(2); } options |= F_RROUTE; break; case 'T': if (options & F_RROUTE) {
fprintf(stderr, "Only one of -T or -R may be used\n"); exit(2); } options |= F_TIMESTAMP; if (strcmp(optarg, "tsonly") == 0) ts_type = IPOPT_TS_TSONLY; else if (strcmp(optarg, "tsandaddr") == 0) ts_type = IPOPT_TS_TSANDADDR; else if (strcmp(optarg, "tsprespec") == 0) ts_type = IPOPT_TS_PRESPEC; else {
fprintf(stderr, "Invalid timestamp type\n"); exit(2); } break; case 'I': {
#if 0 char dummy; int i1, i2, i3, i4; if (sscanf(optarg, "%u.%u.%u.%u%c", &i1, &i2, &i3, &i4, &dummy) == 4) {
__u8 *ptr; ptr = (__u8*)&source.sin_addr; ptr[0] = i1; ptr[1] = i2; ptr[2] = i3; ptr[3] = i4; options |= F_STRICTSOURCE; } else {
device = optarg; }#else if (inet_pton(AF_INET, optarg, &source.sin_addr) > 0) options |= F_STRICTSOURCE; else device = optarg;#endif break; } case 'M': if (strcmp(optarg, "do") == 0) pmtudisc = IP_PMTUDISC_DO; else if (strcmp(optarg, "dont") == 0) pmtudisc = IP_PMTUDISC_DONT; else if (strcmp(optarg, "want") == 0) pmtudisc = IP_PMTUDISC_WANT; else {
fprintf(stderr, "ping: wrong value for -M: do, dont, want are valid ones.\n"); exit(2); } break; case 'V': printf("ping utility, iputils-ss%s\n", SNAPSHOT); exit(0); COMMON_OPTIONS common_options(ch); break; default: usage(); } } argc -= optind;//optind是解析到的参数的个数,argc是参数的总数,减去之后argc是错误的参数的个数 argv += optind;//当getopt返回后,此时argv已已经重新排序.argv+optind之后,指向了首个没有解析出来的参数//接下来对改变的各种参数进行判断并做各种动作getopt会做下面几件事1/对argv进行分析,每次返回一个argv[i]2/解析成功,optind加13/解析不成功,将argv[i]放入argv的后面4/接着分析-a 后面的参数,以optarg代入,且一个 -a 后面只能跟一个参数 //main函数里面一般做的是初始化,设置权限,然后解析参数,设置状态位.然后接着,调用实际功能函数

转载地址:http://btigi.baihongyu.com/

你可能感兴趣的文章
getopt 解析
查看>>
文章标题
查看>>
linux前后台切换
查看>>
nmap
查看>>
uboot执行顺序main_loop
查看>>
uboot编译内容详解
查看>>
uboot Makefile 分析
查看>>
uboot网络验证
查看>>
烧写uboot
查看>>
QT安装
查看>>
QtCreator介绍
查看>>
QT工程实例
查看>>
pkg-config
查看>>
Linux内核分析-1/反汇编(堆栈)
查看>>
Linux内核分析-2/时间片轮转多道程序
查看>>
Linux内核分析-4/5/系统调用
查看>>
c/c++常见关键字
查看>>
C++内存地址分配和内存区划分简介
查看>>
C++数值交换
查看>>
指针数组、数组指针、函数指针、指针函数
查看>>