当前位置: 首页 > news >正文

【Linux】main函数的参数列表从何而来?




在这里插入图片描述



        Linux系统进程通过exec系列函数启动新程序时,argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数,显式传递给新程序的 main 函数。



main函数的参数列表

在C语言中,main函数的标准参数列表通常如下所示:

int main(int argc, char *argv[], char *env)
{// 函数体
}

其中:

  • argc:表示命令行参数的数量(包括程序名本身)。

  • argv:是一个字符指针数组,包含了所有命令行参数的字符串表示。

  • env:环境变量表



参数来源及底层原理


1. argc
  • 来源argc(Argument Count)表示传给程序的命令行参数的数量。这个数量包括了程序本身的名称作为第一个参数。
  • 底层原理:当调用exec系列函数时,会将一个整数参数 argc ,传递新程序的main函数,表示参数的数量。
2. argv
  • 来源argv(Argument Vector)是一个字符指针数组,包含了所有命令行参数的字符串表示。每个元素是一个字符串,表示一个命令行参数。
  • 底层原理:当调用exec系列函数时,会将一个字符指针数组 argv ,传递新程序的main函数,这个数组包含了所有的命令行参数。
3.env
  • 来源:父进程获取当前进程PCB中的环境变量表,通过调用exec系列函数,显式传递给子进程,这样子进程就”继承“了父进程的环境变量表



示例代码


下面是一个简单的示例代码,展示了如何通过exec系列函数传递命令行参数:

(注:注释很详细了,若有疑问,可以评论区讨论)

#include <stdio.h> // 包含标准输入输出库,用于printf和fprintf函数
#include <unistd.h> // 包含UNIX标准函数定义,用于fork和execve函数
#include <sys/types.h> // 包含数据类型定义,用于定义pid_t类型
#include <sys/wait.h> // 包含等待子进程状态的函数和宏定义,用于waitpid和WIFEXITED
#include <stdlib.h> // 包含标准函数库,用于exit函数int main() {pid_t pid; // 定义pid_t类型的变量pid,用于存储子进程的进程IDchar *args[] = {"/bin/echo", "Hello, world!", NULL}; // 定义execve函数的参数数组,指定要执行的命令和参数// 获取当前环境变量数组char **environ = environ;// 使用fork函数创建子进程pid = fork();if (pid < 0) {// 如果fork失败,输出错误信息并退出程序fprintf(stderr, "Error: Could not fork.\n");exit(1);}// 如果pid为0,表示当前是子进程if (pid == 0) {// 在子进程中调用execve函数,执行/bin/echo命令并传递参数if (execve(args[0], args, environ) == -1) {// 如果execve执行失败,输出错误信息并退出子进程fprintf(stderr, "Error: Could not execute %s.\n", args[0]);exit(1);}} else {// 如果pid大于0,表示当前是父进程// 父进程等待子进程结束int status;waitpid(pid, &status, 0); // 使用waitpid函数等待子进程结束,并获取子进程的退出状态if (WIFEXITED(status)) { // 检查子进程是否正常退出// 如果子进程正常退出,打印退出状态码printf("Child process exited with status %d.\n", WEXITSTATUS(status));}}return 0; // 程序正常退出,返回0
}

相关文章:

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时&#xff0c;argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数&#xff0c;显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中&#xff0c;main函数的标准参数列表通常如下所示&#xff1a; in…...

缓冲区类QBuffer

1、QBuffer继承自QIODevice 2、是一种随机设备 3、和QFile类似&#xff0c; 4、有了 QBuffer&#xff0c;你可以把 QByteArray 当成文件一样来操作 其主要作用就是像QFile操作文件一样来操作一块QByteArray&#xff08;内存区域&#xff09;&#xff0c;比如读和写 常用方…...

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…...

MySQL程序介绍<二>

目录 mysqlcheck - 表维护程序 Mysqldump - 数据库备份程序 mysqladmin - MySQL 服务器管理程序 mysqlshow - 显⽰数据库、表和列信息 mysqldumpslow - 总结慢查询⽇志⽂件 ​编辑 mysqlbinlog - 处理⼆进制⽇志⽂件 mysqlslap - 负载仿真客⼾端 接着上篇继续介绍MySQL…...

Java项目实战II基于Spring Boot的毕业就业信息管理系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高校扩…...

LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目

题目&#xff1a; 给你一个整数数组 arr 和两个整数 k 和 threshold 。 请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。 思路&#xff1a;定长滑动窗口 入 更新 出 代码&#xff1a; class Solution {public int numOfSubarrays(int[] arr, int k, int t…...

【电商项目】1分布式基础篇

1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123&#xff08;修改linux网络设置&开启root密码访问&#xff09; 设置主机名和hosts映射 主机名解析过程分析&…...

PHP嵌套函数

PHP嵌套函数&#xff08;Nested Functions&#xff09;在标准的PHP语法中并不直接支持&#xff0c;也就是说&#xff0c;你不能在一个函数内部直接定义另一个函数。然而&#xff0c;可以通过闭包&#xff08;Closures&#xff09;和匿名函数&#xff08;Anonymous Functions&am…...

外包干了2个月,技术明显退步

回望过去&#xff0c;我是一名普通的本科生&#xff0c;于2019年通过校招有幸加入了南京某知名软件公司。那时的我&#xff0c;满怀着对未来的憧憬和热情&#xff0c;投入到了功能测试的岗位中。日复一日&#xff0c;年复一年&#xff0c;转眼间&#xff0c;我已经在这个岗位上…...

kaptcha依赖maven无法拉取的问题

老依赖了&#xff0c;就是无法拉取&#xff0c;也不知道为什么&#xff0c;就是用maven一直拉去不成功&#xff0c;还以为是魔法的原因&#xff0c;试了好久发现不是&#xff0c;只好在百度寻求帮助了&#xff0c;好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…...

48.旋转图像

秋招未止脚步不止&#xff0c;大厂&#xff0c;我一定要上大厂&#xff01; 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 自己的思路 感觉好难&#xff0c;想不出来. 噫噫噫&#xff0c;我想着想着又想出来了。 //发现规律了&#xff0c;先左右对称&#xff0c; 再…...

每天5分钟玩转C#/.NET之goto跳转语句

前言 在我们日常工作中常用的C#跳转语句有break、continue、return&#xff0c;但是还有一个C#跳转语句很多同学可能都比较的陌生就是goto&#xff0c;今天大姚带大家一起来认识一下goto语句及其它的优缺点。 goto语句介绍 goto 语句由关键字 goto 后跟一个标签名称组成&…...

Java处理大数据小技巧:深入探讨与实践

引言 一、选择合适的数据结构 1. 使用高效的集合 2. 并发安全的数据结构 二、内存管理 1. JVM参数调优 2. 避免内存泄漏 三、并行计算与分布式处理 1. 利用Java并发API 2. 分布式框架 四、数据压缩与序列化 1. 数据压缩 2. 高效序列化 五、外部存储与缓存 1. NoS…...

我开源了Go语言连接数据库和一键生成结构体的包【实用】

项目地址&#xff1a;https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块&#xff0c;支持常见的数据库&#xff08;MySQL、PostgreSQL、SQLite、SQL Server&#xff09;。该模块不仅提供了数据库连接函数&#xff0c;还能自动生成数据表对应的结…...

Sentinel 快速入门

前置推荐阅读:Sentinel 介绍-CSDN博客 前置推荐阅读&#xff1a;Nacos快速入门-CSDN博客 快速开始 欢迎来到 Sentinel 的世界&#xff01;这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#xff09;&#xff1a…...

基于SpringBoot健康生活助手微信小程序【附源码】

基于SpringBoot健康生活助手微信小程序 效果如下&#xff1a; 管理员登录界面 管理员主界面 用户管理界面 健康记录管理界面 健康目标管理界面 微信小程序首页界面 活动信息界面 留言反馈界面 研究背景 近年来&#xff0c;由于计算机技术和互联网技术的飞速发展&#xff0c;…...

功能安全实战系列-软件FEMA分析与组件鉴定

本文框架 前言1. 功能安全分析1.1 Why1.2 What?1.3 How?1.3.1 分析范围确定1.3.2 失效模式分析1.3.3 安全措施制定1.3.4 确认是否满足功能安全目标2. 软件组件鉴定2.1 Why2.2 How?前言 在本系列笔者将结合工作中对功能安全实战部分的开发经验进一步介绍常用,包括Memory(Fl…...

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…...

svn-拉取与更新代码

右键项目文件 进行更新与提交代码&#xff0c;提交代码选择更改的文件以及填写commit...

【C++ 算法进阶】算法提升四

数组查询问题 &#xff08;数组优化&#xff09; 题目 数组为 {3 &#xff0c; 2&#xff0c; 2 &#xff0c;3 &#xff0c;1} 查询为&#xff08;0 &#xff0c;3 &#xff0c;2&#xff09; 这个查询的意义是 在数组下标0~3这个范围上 有多少个2 &#xff08;答案为2&…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...