『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?

这篇具有很好参考价值的文章主要介绍了『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

💐专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 Linux从入门到精通,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法

💐文章导读

你知道main函数有几个参数呢?你使用过它们吗?本章我们就一起来认识一下main函数的几个不常见但是作用很大的参数~

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

🐧引例1

在Linux中,当我们生成一个可执行程序后一般要使用./ + 文件名的方式运行(./为文件的路径)。我们应该知道例如ls、pwd、touch等这些指令其实都是一个个可执行程序,那么为什么ls在执行的时候不需要用到./呢?

还有ls在执行的时候还可以添加一些参数呢?例如:ls -als -l等。那么我们自己生成的程序能否做到呢?

🐧引例2

在你的印象中,C语言中的main函数有参数吗?有几个参数呢?你是否见过这样的场景:

#include<stdio.h>

int main(int argc,char* argv[],char* envp[])
{
  printf("myprocess\n");
  return 0;
}

如果你见过,那么你清楚这些参数该怎么使用吗?

🐦认识环境变量

🔔环境变量的概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数;

🔔常见的环境变量

常见的环境变量有这些(我们可以使用$+环境变量名来查看环境变量的值):

  • PATH:指定命令的搜索路径;

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

假若我们也想将自己的程序像ls那样不指定路径就可以执行该怎么做呢?使用命令:

$ export PATH=$PATH:文件名

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

如上图所示,当我们把可执行程序的路径添加到环境变量PATH中以后,就可以直接使用文件名来执行程序了。

第二种方法

除了上面那种方法我们还可以将可执行程序拷贝到指定目录下(记得要以root的身份):

$ cp -rf 文件名 /usr/bin

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

除了PATH以外,还有其它环境变量例如: HOMEPWD等等。

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

或者使用指令 env 查看所有的环境变量:

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

🔔和环境变量相关的指令

  • echo: 显示某个环境变量值;
  • export: 设置一个新的环境变量;
  • env: 显示所有环境变量;
  • unset: 清除环境变量;
  • set: 显示本地定义的shell变量和环境变量;

🐦main函数的第三个参数

引例中提到了main函数是有参数的,我们首先来看看main函数的第三个参数——envpenvenvironment(环境)的缩写,猜一下它应该和环境变量有些关系。

首先我们可以观察到envp是一个指针数组的类型,它其实是一个表结构,这张表中的内容就是一个个的环境变量。

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维
环境变量表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境变量字符串。且该表的结尾必须为NULL

🔔如何通过代码获取环境变量

🦋方法一 使用参数获取

第一种方式,我们可以遍历main函数提供的这张环境变量表。代码如下:

#include<stdio.h>

int main(int argc,char* argv[],char* envp[])
{
  for(int i = 0; envp[i]; ++i)
  {
    printf("envp[%d] = %s\n",i,envp[i]);
  }
  return 0;
}

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

🦋方法二 使用全局变量获取

除了参数,库还为我们提供了一个全局变量environ。该变量是char**类型,其实就如同envp一样,使用方法也相同。

  • libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
#include<stdio.h>

int main(int argc,char* argv[],char* envp[])
{
  extern char** environ;

  for(int i = 0; environ[i]; ++i)
  {
    printf("environ[%d] = %s\n",i,environ[i]);
  }
 // for(int i = 0; envp[i]; ++i)
 // {
 //   printf("envp[%d] = %s\n",i,envp[i]);
 // }
  return 0;
}

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

🦋方法三 使用系统调用获取(最实用)

我们还可以使用系统调用getenv来获取指定的环境变量,这种方法也是最实用的方法。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc,char* argv[],char* envp[])
{
  char* path = getenv("PATH");
  if(path == NULL)
    perror("getenv");
  else 
    printf("%s\n",path);
    
  return 0;
}

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

🔔环境变量的全局属性

  • 环境变量通常具有全局属性,可以被子进程继承下去;
🦋证明

当一个程序变成进程,他的父进程就是bash。那么我们如果将某个环境变量添加到bash的环境变量表里面,该进程能够使用吗?结果如下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc,char* argv[],char* envp[])
{
  char* myenv = getenv("HELLO");
  if(myenv == NULL)
    perror("getenv");
  else 
    printf("%s\n",myenv);

  return 0;
}

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

🐦命令行参数

认识了main函数中的一个参数。其它两个也就非常容易理解了。在引例中我们提到,为什么ls在执行时可以使用-a、-l等选项,我们平时写的程序怎么不需要呢?

其实main函数为我们提供了这个功能,我们只是平时不太用而已。

🦋Demo

写一个程序测试一下我们能否使用命令行参数:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc,char* argv[],char* envp[])
{
  for(int i = 0; i < argc; i++)
  {
    printf("argc: %d,argv[%d]=%s\n",argc,i,argv[i]);
  }
  return 0;
}

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

🔔有什么用?

我们看到了命令行参数的使用,那么我们平时该怎么使用呢?

我们可以使程序根据不同的命令行参数执行不同的内容从而达到一个程序多种使用的效果。例如:

  • 设计一个计算器,要求可以根据不同的选项完成不同的计算;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Usage(const char* name)
{
  printf("\nUsage:%s -[+][-][*][/]\n\n",name);
  exit(-1);
}
int main(int argc,char* argv[],char* envp[])
{
  if(argc!=2) // 必须指定输入一个参数
    Usage(argv[0]);

  int n1 = 0;
  int n2 = 0;
  int ret = 0;
  printf("-----num1 = ");
  scanf("%d",&n1);
  printf("-----num2 = ");
  scanf("%d",&n2);
  if(strcmp(argv[1],"-+")==0) 
    ret = n1 + n2;
  else if(strcmp(argv[1],"--")==0) 
    ret = n1 - n2;
  else if(strcmp(argv[1],"-*")==0) 
    ret = n1 * n2;
  else if(strcmp(argv[1],"-/")==0) 
    ret = n1 / n2;
  printf("\n-----resault = %d\n",ret);
  return 0;
}

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

本章的内容就到这里了,觉得对你有帮助的话就支持一下博主把~

『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?,Linux从入门到精通,linux,c语言,运维

点击下方个人名片,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓文章来源地址https://www.toymoban.com/news/detail-595847.html

到了这里,关于『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始实现C++ TinyWebServer(六)---- 这或许是你见过的最容易理解的HTTP连接

    今天上完体育课打完球发现了一家咖啡店,我之前一直纳闷数据谷里面没有咖啡店呢,结果今天就给我找到了。这家咖啡店的位置开的非常隐蔽,一到门口一条小狗就一直贴着我闻,走到店里面去点咖啡,店里装修的还不错,在这个位置也挺安静的,店里的咖啡师小姐姐说好

    2024年02月11日
    浏览(44)
  • 【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

    在使用GCC编译器进行程序开发时,我们经常会遇到一些编译过程中的问题, 比如为什么要加上\\\"-c\\\"选项,以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题,并给出相应的代码和解释,帮助读者更好地理解GCC编译过程中的\\\"-c\\\"选项和main函数的参数a

    2024年02月12日
    浏览(69)
  • Django的render()函数的三个主要参数详解,特别是第三个字典类型的参数context

    当在Django中使用 render() 函数时,它有三个主要参数: request , template_name ,和 context 。第三个参数,即 context ,是一个字典,用于将数据传递给模板以进行渲染。 在下面的代码中: request : 这是视图函数接收到的用户请求对象,包含了用户的HTTP请求信息,例如请求方法、G

    2024年02月11日
    浏览(39)
  • 如何给Java中的main函数参数args传参

    创建java测试类: JAVA类中main函数的参数String [] args,指的是运行时给main函数传递的参数。 传参的方式有以下几种: 1、idea工具的测试类中,左上角菜单中点击Run,选择Edit Configurations…,找到Program Arguments,添加参数   参数添加成功后,运行Java测试类后,结果如下:   2、

    2024年02月08日
    浏览(41)
  • C语言学习之main函数两个参数的应用

    main函数的两个参数: 参数argc: 表示在执行程序时,在终端所输入参数的个数, 包括可执行文件的名称 ; 参数argv: 1.本质上是一个 字符型指针数组 ; 2.用于获取指针数组中每个成员所指向的字符串; 3.存储时,参数argv指向所传递的 字符串的首地址 ; 伪代码表示: 测试代

    2024年02月11日
    浏览(55)
  • 详解main函数参数argc、argv及如何传参

    目录 1、main()函数参数 2、main函数如何传参 2.1 环境准备 2.2 通过 Powershell 窗口传参 2.3 通过vs界面传参 3、int main() 和 int main(int argc, char *argv[]) 特点 1、main()函数参数 在C语言中,main函数可以带参数。main函数的原型通常为以下两种形式之一:         在我们实际写代码时,大都

    2024年04月22日
    浏览(35)
  • shell脚本中main函数中$#获取不到脚本传入参数个数浅析

    Linux的shell脚本,有时候我们在运行shell脚本时会给脚本传入参数,出于逻辑上的严谨,在脚本中可能会做一些逻辑判断或处理,例如判断脚本传入参数的个数。一般我们会用$#获取传入参数的个数,假如,我们在shell脚本的main函数中去判断脚本传入参数的个数,类似如下所示

    2024年03月14日
    浏览(99)
  • python main 函数-启动-传递参数 python 打包 exe C# 进程传参

    在Python编程中,我们经常需要从命令行或其他外部环境中获取参数。Python提供了一种简单而灵活的方式来处理这些参数,即通过main函数传参 1.python main 函数-启动-传递参数 test.py 2. 如果直接传参给 脚本 输出:  输入 aa bb cc cc pyinstaller是一个流行的Python打包工具,它可以将P

    2024年02月09日
    浏览(41)
  • C++从入门到精通——缺省参数

    缺省参数是在函数定义时指定的默认值,当调用函数时未提供该参数的值时,将使用缺省值。使用缺省参数可以简化函数调用,提高代码可读性。但需注意,过多使用缺省参数可能导致代码难以理解和维护。 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用

    2024年04月10日
    浏览(50)
  • Ceph入门到精通-sysctl参数优化

    sysctl.conf  是一个文件,通常用于在 Linux 操作系统中配置内核参数。这些参数可以控制网络、文件系统、内存管理等各方面的行为。 99-xx.yml  可能是一个文件名,其中  99-  是一个特定的命名约定。在  sysctl.conf  文件中,通常会有一个特定的顺序来加载配置项。通常,以 

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包