IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> argc,argv是什么 -> 正文阅读

[系统运维]argc,argv是什么

来源:微信公众号「编程学习基地」

argc,argv是什么

如果你是一个 Linux 开发者,那么你一定需要给应用程序传递参数。

刚接触C语言的童鞋,学的第一个程序一定是这样的

#include<stdio.h>
int main()
{
    printf("hello world\n");
}

接触完 Linux 下C语言编程的童鞋,他会这样做

#include<stdio.h>
int main(int argc,char*argv[])
{
    printf("argc:%d,argv[0]:%s\n",argc,argv[0]);
}

这个argc,argv有什么用?,先看下输出结果

# ./main 
argc:1,argv[0]:./main

我们传递一个参数看看

# ./main -v
argc:2,argv[0]:./main

可以大概猜一下,argc跟命令行参数数量有关,argv跟命令行参数有关

修改下程序试着获取传递的参数

#include<stdio.h>
int main(int argc,char*argv[])
{
    for(int index=0;index<argc;index++){
        printf("argc:%d, argv[%d]:%s\n",index,index,argv[index]);
    }
}

测试一下效果

# ./main
argc:0, argv[0]:./main
# ./main -p
argc:0, argv[0]:./main
argc:1, argv[1]:-p
# ./main -p 80
argc:0, argv[0]:./main
argc:1, argv[1]:-p
argc:2, argv[2]:80

这次可以确定了,argc是传递给应用程序的参数个数,argv是传递给应用程序的参数,且第一个参数为程序名。

如何解析程序参数

既然argc,argv可以传递参数,那我们如何分析命令行参数?

这里有个函数给大家介绍下

#include <unistd.h>
int getopt(int argc, char * const argv[],
          const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

函数说明:getopt()用来分析命令行参数。
1、参数argc 和argv 是由main()传递的参数个数和内容
2、参数optstring 则代表准备处理的选项字符串

“选项”是什么?

在linux下大家都用过这样一条指令吧:gcc -o main main.cpp

这条指令中的 -o 就是命令行的选项,后面的 main-o 选项所携带的参数

有些选项是不用带参数的,而这样不带参数的选项可以写在一起,例如 rm -rf

"选项字符串"是什么

先看例子吧,"a:b:cd::e",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。

冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数,没有参数就会报错。

参数的输入形式 -p80 或者 -p 80,都表示 80 是 -p 的参数。

两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数。

需要注意的是两个冒号之间不能有空格。

解析参数

了解完选项和选项参数之后就是通过 getopt 这个函数解析参数了

在此之前了解一下几个全局参数

extern char *optarg; 用来保存选项的参数

extern int optind 用来记录下一个检索位置

opterr 是否将错误信息输出到stderr,为0时表示不输出

optopt 保存的是无法识别的选项

大概了解完之后,我们的示例程序如下

#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[])
{
    int optch = 0;
	while((optch = getopt(argc, argv, "a:b:cd::e")) != -1)
	{
        // printf("optind: %d\n", optind); //下一个检索位置,即选项的参数位置
		switch (optch)
		{
        case 'a':
            printf("-a %s\n", optarg);
            break;
        case 'b':
            printf("-b %s\n", optarg);
            break;
        case 'C':
        case 'c':
            printf("-c %s\n", optarg);
            break;
        case 'd':
            printf("d:%s\n", optarg);
            break;
        case 'e':
            printf("-e %s\n", optarg);
            break;
        case '?':
        printf("Unknown option: %c\n",(char)optopt);    //表示不在选项字符串optstring中的选项
            break;
        default:
            break;
		}
	}
    // printf("opterr:%d\n",opterr);  //opterr表示是否将错误信息输出到stderr,为0时表示不输出
}

测试程序的选项字符串是a:b:cd::e ,对应的是几个case标签,执行程序分别验证下

a和b有一个 : ,所以a,b选项后面必须携带参数

# ./main -a test
-a test
# ./main -b 
./main: option requires an argument -- 'b'
Unknown option: b

不携带参数的话就会无法识别参数

c和e没有 : ,所以 c 选项就类似于 -version 一类的选项

# ./main -c
-c (null)
# ./main -c test
-c (null)

d有两个: ,所以d选项的参数是可选的,但是要注意参数与选项之间不能有空格

# ./main -dtest
d:test
# ./main -d test
d:(null)

Linux基础知识科普就介绍到这里,下一期是关于文件操作的。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:13:03  更:2021-10-24 15:14:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:47:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码