C语言综述/Hello World/Linux常用基础命令

点击返回博客主目录

点击返回C语言基础知识目录大纲

1.Hello World


这个世界,几个每个程序员入门的第一段代码都是Hello world。原因是当年C语言的作者,Dennis Ritchie(丹尼斯.里奇)在他的名著《C语言程序设计(The C Programming Langupeach)》中第一次引入,传为后世经典,其它语言亦争相效仿,以示致敬。

1.1 源程序

1.1.1 C语言版

#include<stdio.h> // 程序中因为调用了printf库函数,所以要包含printf所在的头文件

int main() // 程序的入口,表示计算机从哪里开始执行此程序,有且,只有一个
{
    printf("Hello world!\n"); // 调用库函数,向屏幕打印Hello World!

    return 0; // main函数的返回值
}

大家可能也会看到void main() { return; }的这种写法,出现这种情况的原因是c语言最早的时候只是规范和标准。比如c11,c11其实也是一种规范和标准,但是c11的推行和推动需要各大产商进行支持,这里就会出现有的产商支持,有的产商不支持。所以这里就会发现c语言虽然是一种规范和标准,但是它的推动和发展是由各大产商决定的,比如微软MicroSoft(vc)、Borland Turbo C(tc)、GUNC(gcc)这几家公司分别对c语言这种规范进行实施,在规范的实施过程中各家公司对c标准就稍微有了一些不同的变化。在这个过程中,gcc执行的标准最规范,比如vc对返回值就不关心,但是gunc的返回值就是int类型,这就是会看到不同版本写法的原因。

1.1.2 C++版

#include<iostream> // 程序中因为用到了cout库函数,所以要包含cout所在的头文件

using namespace std; // 用到的命名空间

int main() // 程序的入口,表示计算机从哪里开始执行此程序,有且,只有一个
{
    cout<<"Hello world!"<<endl; // 通过类对象cout向屏幕输出Hello world!

    return 0; // main函数的返回值
}

1.2 注释


上面的两个示例中,//后面的语句,表示程序的注释,用来注释的作用,不参与编译,以便后期的维护和管理。这是单行注释
/**/是多行注释,但是需要注意的是多行注释不支持嵌套的。因为 /* 只会找最近的 */进行配对,别的会被忽略
一般来说需要多行注释的时候,用条件编译 #if 0 endif

1.3 从源程序到可执行程序


源程序就是一个.txt的普通文本文件,是经历了哪些过程变成可执行文件的呢?大体上分为四个步骤:预处理->编译->汇编->链接 四个过程。

  • hello.c源程序(文本)通过预处理器cpp变成hello.i被修改的源程序(文本)
  • hello.i被修改的源程序(文本)通过编译器ccl变成hello.s汇编程序(文本)
  • hello.s汇编程序(文本)通过汇编器cis变成hello.o可重定位目标程序(二进制)
  • hello.o可重定位目标程序(二进制)通过链接器ld变成hello可执行目标程序(二进制)

1.3.1 集成开发环境


对于集成开发环境(IDE:Integrated Development Environment)而言,减少了环境配置,合并了流程,使其便于快速开发。就Qt开发环境而言,只需一步即可;它将预处理、汇编、编译、链接都进行完成,让用户对这些过程不可知。

1.3.2 手动编译


unix/linux环境下,通常没有界面,所以少有集成开发环境。所有的开发均是在命令行模式下开发的。以vim为编辑器,以gcc为编译器为例,演示。

  • vim hello.c

  • gcc -E hello.c -o hello.i // 处理文件包含宏和注释
    -E之后跟要处理的文件,-o output表示生成的文件 hello.i代表预处理之后的文件类型
    1.3.2
    从上图中可以看出通过预处理后源文件中的注释被处理了,从这里可以看出注释这个东西只是给程序员看的,同时将#include<stdio.h>的头文件内容完全展开放入了文件中,这就是编译的第一个阶段。

  • gcc -S hello.i -o hello.s // 编译为汇编文件
    这是第二个阶段,也是编译阶段,-S是进行汇编,hello.s是汇编文件格式
    1.3.2以上就是汇编文件的大概内容

  • gcc -c hello.s -o hello.o // 经汇编后为二进制的机器指令
    hello.o一般叫做目标文件,实际上这个文件已经是二进制文件了
    1.3.2从上图中可以看到.o文件是不能看的,因为这已经是二进制文件了。这里既然二进制文件大家可能有这个文件是不是已经可以执行的疑问,这里我们先测试一把。因为需要有 可执行权限,文件才可以执行,这里我们先给它加上可执行权限。
    1.3.2从上图可以看出:提示报错这是一个不可执行的二进制文件,这时因为这个.o文件中引用了printf这个函数,这个函数是以库的形式呈现的,所以说我们需要链接这个动态库

  • gcc hello.o -o hello // 链接所用到的库
    这是最后一步,也叫做链接
    1.3.2从上图可以看出,对最后链接后生成的可执行文件进行执行,得到了结果的输出
    这些是原始的方式,原始的方式更能体现出本质来
    预处理:预处理相当于根据预处理命令组装成新的C程序,不过常以i为扩展名。
    编译:将得到的i文件翻译成汇编代码.s文件
    汇编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的o文件。该文件是二进制文件,字节编码是机器指令。
    链接:将引用的其他o文件并入到我们程序所在的o文件中,处理得到最终的可执行文件。
    linux环境虽然简陋,但是向我们呈现出的是本质的东东,一上手,就用集成开发环境可能有些细节,很久都搞不明白。

1.4 致敬大师


肯尼思.汤普林 丹尼斯.里奇(——2012.05.10) 这两个并称C语言和unix作者。丹尼斯.里奇可以称得上近代计算机的奠基人。肯尼思.汤普林现在供职于谷歌,从事go语言的开发。未来google可能会取代java用go语言一统天下。
“牛顿说他是站在巨人的肩膀上,如今,我们都站在里奇的肩膀上”——克尼汉
“他是虔诚而纯粹的计算机天才,侵犯他人的电脑是绝不干的。”——潘嘉杰
知人论世 读其诗,颂其书,不知其人可乎?
“丹尼斯里奇先生的专业精神令人感动,近40年如一日,在他所从事的领域辛勤耕耘,他的多项发明,包括C语言,Unix,也包括Plan9,无论哪一项,在软件发展史上都有着举足轻重的地位,和他的伟大成就形成对照的是他的行事,态度低调,他的表达,像他的软件一样,简洁生动而准确。c++的成功,很大一部分也来自于c,是c语言的普及和深入,才有了后面的凤凰涅磐,从另一个角度,在同另一语言大师Pascal之父Niklaus Wirth交流时,c++的名字也是源自c语言的利器,Wirth先生不无惋惜地表示,后来他开发的语言可惜没叫Pascal2。”——著名的计算机学家N.Wirth如是说。

2.Linux常用基础命令


本章节旨在简略的介绍linux的基本使用,可能会在讲解语言的过程中作一些平台差异对比。目的只有一个就是混个脸熟,我们后面会有专业课堂来讲解。

2.1 版本选择

2.1.1 内核版本


Linux内核是开源,开源地址:https://www.kernel.org/ 如此好的东西,都开源了,想想都激动。
作者Linux Torvalds,Linux最开始是由linux完成,然后开源,全世界的程序员都在为它贡献代码。大神级别的人物,无需赘言,只需膜拜。
查看内核版本的命令如下:

2.1.1.1 uname:查看内核版本命令


2.1.1.1
5.8.0代表内核版本
[root@localhost Desktop]# uname -r
2.6.32-573.e16.i686
版本信息:
XX YY ZZ
XX:主版本号YY:次版本号ZZ:末版本号
大部分情况下,我们只需要关心主版本号和次版本号,一般来说软件行业内不推荐大家用最新的版本,因为版本越新基本意味着bug越多,通常用成熟稳定的版本
2.5.7 5奇数 开发版本
2.6.33 6偶数 稳定版本
不过现在的版本好像不太遵守这个条件了,比如4.5.4是稳定版本

2.1.2 发行版本


内核是不能直接运行在某个具体的机型上,比如x86,spark,powerpc,需要适配,于是就有了各种发行版本。发行版本包含了以内核为基础的所有服务。当然了,发行版本中,还内置了众多软件服务和人性化的交互界面,常见的发行版本如下:
redhat、suse、ubuntu、centos、fedora、红旗linux、
红旗Linux是国产版本的发行版本,只不过现在已经黄了。
redhat红帽在众多的发行版本中是最成熟的一种,使用量也是最多的。
suse是欧洲人用的比较多一点儿。
ubuntu是以界面见长,被大家所熟知
fedora相当于是redhat的摇篮版本,也就是说最新的技术现在fedora上实现,当技术在fedora上稳定了之后再移植到redhat上
centos其实是redhat的一个社区版本,基于LGPL协议(用了免费的东西,你可以自由的分发,修改,前提是你写的东西你也要分发出去)
在众多的版本中,我们为什么会选择CentOS?
CentOS是Community Enterprise Operating System的简称,我们有很多人叫它社区企业操作系统,社区版本其实就是拿到redhat的源码再次编译整合。不管你怎么叫它,它都是linux的一个发行版本。CentOS,来自大名鼎鼎的Redhat公司的RHEL(Red Hat Enterprise Linux)产品的克隆版本。RHEL在系统的稳定性,前瞻性和安全性上有着极大的优势。RHEL需要向RedHat付费才可以使用,并能得到付费用户的服务及技术支持和版本升级。这个CentOS可以像REHL一样的构筑linux系统环境,但不需要像RedHat付任何的费用,同样也可以得到有偿技术支持和升级服务。
何乐而不为呢?

2.2 目录结构

2.2.1 系统目录


打开我的电脑的一瞬间,大家的第一反应就是,怎么一堆文件夹,我的盘符(c盘,d盘等)怎么不见了?
Window分区在盘符下面,比如我们通常进入windows后会看到C盘和D盘,而所有的文件都放在这两个盘符下面。而linux分区挂在文件目录下面,比如我们进入linux后通常只能看到光驱和文件系统而看不到盘符,实际上在默认安装的情况下,linux至少有两个分区/和/dev,我们能看到的通常是如下的目录结构:
呈现一种目录树的结构

/
bin
boot
dev
etc
home
lib
root
usr
mnt
...
grub
lost+found
bin
local
share
...
bin
man
src
...
man1
php.1
目录描述
/根目录
/bin做为基础系统所需要的最基础的命令就是放在这里。比如ls、cp、mkdir等命令;功能和/user/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。
/bootLinux的内核及引导系统程序所需要的文件,比如vmlinuz initrd.img文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;启动装载文件存放位置,如kernel,intrd,grub。一般是一个独立的分区。
/dev一些必要的设备,声卡、磁盘等。还有如/dev/null,/dev/null,/dev/console,/dev/zero,/dev/full等
/etc系统的配置文件存放地。一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;/etc/opt:/opt对应的配置文件 /etc/X11:Xwindows系统配置文件 /etc/xml:XML配置文件
/home用户工作目录,和个人配置文件,如个人环境变量等,所有的帐号分配一个工作目录。一般是一个独立的分区。
/lib库文件存放地。bin和sbin需要的库文件。类似windows的DLL
/media可拆卸的媒介挂载点,如CD-ROMs、移动硬盘、U盘,系统默认会挂载到这里来。
/mnt临时挂载文件系统。这个目录一般是用于存放挂载储存设在的挂载目录的,比如有cdrom等目录。可以参看/etc/fstab的定义。
/opt可选的应用程序包。
/proc操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见/etc/fstab
/rootRoot用户的工作目录
/sbin和bin类似,是一些可执行文件,不过不是所有用户都需要的,一般是系统管理所需要使用得到的。
/tmp系统的临时文件,一般系统重启不会被保存
/usr包含了系统用户工具和程序。/usr/bin:非必须的普通用户可执行命令。/usr/include:标准头文件。/user/lib:/usr/bin和/usr/sbin/的库文件。/usr/sbin:非必须的可执行文件。/usr/src:内核源码。/usr/X11R6:X Window System,Version 11,Release 6.
/srv该目录存放一些服务启动之后需要提取的数据

2.2.2 分区与目录


Linux下磁盘分区和目录的关系如下:

  • 任何分区都必须挂载到某个目录上。
  • 目录是逻辑上的区分,分区是物理上的区分。
  • 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。
  • 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
    分区1挂载在/目录上
/
/home
分区2
/var
分区3
/usr
/bin
/boot
...
/tmp
分区3
/sbin

在Window下比如有250G,我们可以很清楚的看到C盘、D盘…占了多少G的大小。比如我们在安装系统的时候给linux分配了60G的大小,那么这60G去了哪里呢?

2.2.2.1 linux U盘(FAT32模式)的使用

  • 1 查看你U盘是否接入
    2.2.2.1.1
    可以看到U盘被识别成了sdc4
    2.2.2.1.2

  • 2 建立挂载节点
    2.2.2.1.2

  • 3 挂载命令
    2.2.2.1.3

  • 4 卸载命令
    2.2.2.1.4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值