C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!

是的,你没有看错,从今天开始,公众号会持续原创一系列C语言的内容,同时穿插操作系统,组成原理,汇编,以及一些类比,目的是让大家能够在抽象中寻到具象,也是我想分享的计算机学习方法。

之前的我写作,一直都是追求往前创新,而不想回顾过去自己的知识,但是这段时间在B站讲课,直播,发现大家问的很多问题,其实我都遇见过,也找到了解决的方法,所以有了这个引子,也就有了这个专题。

这个专题当时写了11个小节,然后在不断细化后,越来越多,形成了体系,于是准备慢慢来说,把这个计算机的建立过程拆解,摆在大家面前,再也不是庞然大物,而是有迹可循。

今天我们说下,命令行参数,我们在写工具的时候,基本上都是带着参数的。而在windows XP或更高版本,命令行的最大长度为8191个字符,Linux下可以用这个命令查看,getconf ARG_MAX,一般情况下都是比windows大很多。

之前遇见编译开源项目,爆出的错误是参数太长,通过映射路径,windows下还是长,在Linux下可以编过,最后因为Linux开发的话难度太大,所以对脚本进行了调整,把源码拆分,变成obj后,再进行链接,合并,从而减少参数长度。

那我们先看下命令行参数代码怎么写?我们上一节写的main,是最普通的main,现在常用的就两种。

int main(void){}

int main(int argc,char *argv[]){}

我们平时写的时候,用的第一种,但我们写工具的时候,会用第二种,这个可以传参,我们看下例子:

输出效果是:

main函数的两个参数,argc代表了参数个数,默认是1,也就是程序名字,argv[] 代表传递的参数具体字串,我们使用的时候用这个判断即可。

看到这里大家发现参数很简单,我们平时使用也会用这个,但是这个不是标准的命令参数解析的方法,我们今天看下官方源码是怎么处理的,我们可以下载busybox开源代码学习命令,也可以在https://directory.fsf/wiki/GNU 下载

Coreutils 软件包包括一整套基本的 shell 工具,可以去看各个shell命令的实现,我们今天用busybox里面的实现,来说下就可以。我这里看的是ls的解析,这里我们发现有个getoptxxx,这个就是系统提供的解析参数的方法。

我们找下标准的函数,getopt_long,而这个代码的实现,是在glibc,这个可以在https://mirrors.aliyun/gnu/ 下载,当然这里面有很多工具,都是GNU项目下的源码,可以下载,比如我们的bash就是在这里下载的。

如果你感兴趣,而且真正要学习编程,把这个代码下载下来,去阅读下我们调用的系统方法,它们都是怎么实现的。

我们这里直接看用法,我们看下百度的说明:

这里要去练习,我们测试下,看看效果:

输出的结果:

这里看下b和c的参数,如果必须要参数,是 -b 3 ,使用空格的。如果是可有可无的话,这里-c4 ,c和4是连着的。

而我们平时所说的终端,就是一个程序,这里参考bash的源码,终端等待输入参数,然后判断之后,进行创建子进程,把参数传递进去,等待返回结果,大致的shell运行如下:

参看 https://blog.csdn/ruglcc/article/details/8574113

核心终端的操作逻辑是:fork 创建子进程,然后使用execvp这一组的进程替换程序的机制,进行运行实际的命令,同时使用pipe管道通信,等待子进程的运行结果,然后把结果显示出来。

好了这一讲就分享到这里,下一节我们来说下,c语言从源码到最终可执行程序,每一步都做了什么,以及如何理解每个环节。

~~ end not end ~~

热门文章

零基础新手自学Python编程教程入门精通学习资料网站大全

自学编程C语言不迷路,我私藏的书单分享给你!

零基础新手学习算法Leetcode刷题指南

程序员码农IT工程师自学编程计算机入门进阶学习网站大全

程序员面试题宝典以及相关书籍下载!

计算机类常用电子书整理大全

职场老鸟,互联网十年从业生涯,分享 [Java,Python,安卓,AI,爬虫] 技术文章,学习资料, 热点趣闻等。关注回复 1024 Python 电子书大全 面试资料,给你一份私藏的程序员好礼,永远更新中!赶紧来关注哦!

我的微信 code_gg_boy 。

更多推荐

C语言命令行参数如何解析?你经常用的终端怎么运行的你说不清楚!