【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系列函数启动新程序时,argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数,显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中,main函数的标准参数列表通常如下所示: in…...
缓冲区类QBuffer
1、QBuffer继承自QIODevice 2、是一种随机设备 3、和QFile类似, 4、有了 QBuffer,你可以把 QByteArray 当成文件一样来操作 其主要作用就是像QFile操作文件一样来操作一块QByteArray(内存区域),比如读和写 常用方…...
从一个事故中理解 Redis(几乎)所有知识点
作者:看破 一、简单回顾 事故回溯总结一句话: (1)因为大 KEY 调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用 100%。   (2ÿ…...
MySQL程序介绍<二>
目录 mysqlcheck - 表维护程序 Mysqldump - 数据库备份程序 mysqladmin - MySQL 服务器管理程序 mysqlshow - 显⽰数据库、表和列信息 mysqldumpslow - 总结慢查询⽇志⽂件 编辑 mysqlbinlog - 处理⼆进制⽇志⽂件 mysqlslap - 负载仿真客⼾端 接着上篇继续介绍MySQL…...
Java项目实战II基于Spring Boot的毕业就业信息管理系统设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高校扩…...
LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目
题目: 给你一个整数数组 arr 和两个整数 k 和 threshold 。 请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。 思路:定长滑动窗口 入 更新 出 代码: 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(修改linux网络设置&开启root密码访问) 设置主机名和hosts映射 主机名解析过程分析&…...
PHP嵌套函数
PHP嵌套函数(Nested Functions)在标准的PHP语法中并不直接支持,也就是说,你不能在一个函数内部直接定义另一个函数。然而,可以通过闭包(Closures)和匿名函数(Anonymous Functions&am…...
外包干了2个月,技术明显退步
回望过去,我是一名普通的本科生,于2019年通过校招有幸加入了南京某知名软件公司。那时的我,满怀着对未来的憧憬和热情,投入到了功能测试的岗位中。日复一日,年复一年,转眼间,我已经在这个岗位上…...
kaptcha依赖maven无法拉取的问题
老依赖了,就是无法拉取,也不知道为什么,就是用maven一直拉去不成功,还以为是魔法的原因,试了好久发现不是,只好在百度寻求帮助了,好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…...
48.旋转图像
秋招未止脚步不止,大厂,我一定要上大厂! 题目链接 . - 力扣(LeetCode) 自己的思路 感觉好难,想不出来. 噫噫噫,我想着想着又想出来了。 //发现规律了,先左右对称, 再…...
每天5分钟玩转C#/.NET之goto跳转语句
前言 在我们日常工作中常用的C#跳转语句有break、continue、return,但是还有一个C#跳转语句很多同学可能都比较的陌生就是goto,今天大姚带大家一起来认识一下goto语句及其它的优缺点。 goto语句介绍 goto 语句由关键字 goto 后跟一个标签名称组成&…...
Java处理大数据小技巧:深入探讨与实践
引言 一、选择合适的数据结构 1. 使用高效的集合 2. 并发安全的数据结构 二、内存管理 1. JVM参数调优 2. 避免内存泄漏 三、并行计算与分布式处理 1. 利用Java并发API 2. 分布式框架 四、数据压缩与序列化 1. 数据压缩 2. 高效序列化 五、外部存储与缓存 1. NoS…...
我开源了Go语言连接数据库和一键生成结构体的包【实用】
项目地址:https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块,支持常见的数据库(MySQL、PostgreSQL、SQLite、SQL Server)。该模块不仅提供了数据库连接函数,还能自动生成数据表对应的结…...
Sentinel 快速入门
前置推荐阅读:Sentinel 介绍-CSDN博客 前置推荐阅读:Nacos快速入门-CSDN博客 快速开始 欢迎来到 Sentinel 的世界!这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库(Java 客户端):…...
基于SpringBoot健康生活助手微信小程序【附源码】
基于SpringBoot健康生活助手微信小程序 效果如下: 管理员登录界面 管理员主界面 用户管理界面 健康记录管理界面 健康目标管理界面 微信小程序首页界面 活动信息界面 留言反馈界面 研究背景 近年来,由于计算机技术和互联网技术的飞速发展,…...
功能安全实战系列-软件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…...
【数据结构与算法】链表(上)
记录自己所学,无详细讲解 无头单链表实现 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-拉取与更新代码
右键项目文件 进行更新与提交代码,提交代码选择更改的文件以及填写commit...
【C++ 算法进阶】算法提升四
数组查询问题 (数组优化) 题目 数组为 {3 , 2, 2 ,3 ,1} 查询为(0 ,3 ,2) 这个查询的意义是 在数组下标0~3这个范围上 有多少个2 (答案为2&…...
Redis闭源后如何选择?亚马逊云科技Valkey开源替代方案全解析
1. Redis闭源背景下的技术选择困境 去年Redis官方宣布核心代码转向限制性许可协议后,整个开发者社区都面临着关键抉择。作为曾经最受欢迎的开源内存数据库,Redis的突然转向让许多依赖其开源特性的企业措手不及。我亲眼见过不少团队在技术选型会上激烈争…...
GPEN图像肖像增强镜像实测:5分钟修复老照片,效果惊艳到哭
GPEN图像肖像增强镜像实测:5分钟修复老照片,效果惊艳到哭 1. 老照片修复的新选择 上周在整理家族相册时,我发现了一叠泛黄的老照片。这些珍贵的记忆因为年代久远,已经变得模糊不清,布满划痕和噪点。传统的修图软件要…...
OpenClaw多模态探索:千问3.5-9B处理图文混合任务
OpenClaw多模态探索:千问3.5-9B处理图文混合任务 1. 为什么需要多模态自动化助手 上周我在整理技术文档时遇到一个典型问题:需要根据包含屏幕截图和文字描述的故障报告,编写对应的排查步骤。手动在截图和文本之间来回切换,既低效…...
LightOnOCR-2-1B作品分享:多语言识别效果实测,支持中日英法等
LightOnOCR-2-1B作品分享:多语言识别效果实测,支持中日英法等 1. 引言:多语言OCR的现实需求 在全球化的商业环境中,企业每天需要处理来自不同国家的文档、票据和表单。传统OCR工具往往面临两大挑战:一是对多语言混合…...
阻塞和非阻塞、同步和异步、挂起
阻塞和非阻塞阻塞和非阻塞指的是线程在调用后,线程是否干等。挂起的是任务,阻塞的是线程,任务在线程中处理,线程可以处理不同的任务。即任务挂起、线程阻塞。阻塞的特征:线程完全工作或干等在语句从调用开始到返回结果…...
2026年4月OpenClaw(Clawdbot)如何集成?华为云新手攻略:搭建及大模型API、Skill配置指南
2026年4月OpenClaw(Clawdbot)如何集成?华为云新手攻略:搭建及大模型API、Skill配置指南。OpenClaw(Clawdbot)是2026年主流的AI自动化助理平台,能借助阿里云轻量服务器达成724小时稳定运转&#…...
【JEECG Boot】 JEECG Boot——Online表单 系统性知识体系全解
文章目录JEECG Boot——Online表单一、核心基础认知1.1 官方定义与核心定位1.2 核心价值与解决的痛点1.3 与代码生成器的核心区别1.4 技术栈与运行环境依赖1.5 适用场景与能力边界二、核心架构与底层驱动原理2.1 整体四层架构体系2.2 元数据驱动的核心原理2.3 核心元数据模型与…...
Windows Defender系统优化工具:提升系统性能的终极方案
Windows Defender系统优化工具:提升系统性能的终极方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors/wi…...
千问3.5-9B提示工程:提升OpenClaw复杂任务分解能力
千问3.5-9B提示工程:提升OpenClaw复杂任务分解能力 1. 为什么需要优化任务拆解能力 上周我让OpenClaw执行"整理上季度销售数据并邮件发送给团队"时,AI直接把原始CSV文件作为附件群发——这显然不是人类想要的"整理"结果。这个尴尬…...
Linux异步IO驱动开发实战与优化
1. Linux异步IO驱动开发实战作为一名在Linux驱动开发领域摸爬滚打多年的工程师,我经常遇到需要处理高并发IO的场景。传统的阻塞式IO会导致线程挂起,而非阻塞轮询又浪费CPU资源。今天要分享的异步IO(AIO)技术,可以说是解…...
