getopt 解析

命令源码解析

//一般情况下,源码目录下会有一个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_long
while ((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加1
3/解析不成功,将argv[i]放入argv的后面
4/接着分析-a 后面的参数,以optarg代入,且一个 -a 后面只能跟一个参数
  
//main函数里面一般做的是初始化,设置权限,然后解析参数,设置状态位.然后接着,调用实际功能函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值