第一二章 Linux基础知识——Linux C

一、Linux的shell

1.shell工作原理

登录或启动终端,显示shell提示符——>输入shell命令回车——>shell启动子进程,寻找应用程序并传递参数——>执行应用程序并显示结果——>通知shell执行完毕,子进程终止——>返回shell提示符

例如:sh(进入shell)——>pstree | less(查看进程树)——>exit(退出)
      echo $SHELL(查看使用的shell类型)
2.shell使用
(1)输入输出重定向:
	命令>文件:输出到文件
	命令>>文件:输出追加到文件
(2)管道:将某个程序的输出直接送到另一个程序,作为输入。
	命令1|命令2|命令3...
(3)后台运行命令:
	命令$
	jobs(正在运行的程序)
	fg %后台运行程序的编号(将这个程序放在前台)
3.使用通配符
*:若干个字符
?:一个字符
4.shell使用技巧
tab键补全命令
上下键调用历史命令
history:查看在终端运行过的命令
	history n
	! n(运行编号为n的命令)
命令别名
	alias |||='ls -l -i'

二、Linux的基本操作

1.Linux根目录的子目录
	bin:普通用户常用例程,如date
	dev:存放系统中所有设备名
	home:普通用户的主目录
	lib:内核和应用程序所用的库文件和模块
	root:根用户的主目录
	usr:用户安装的应用程序
	boot:Linux内核、开机配置文件
	etc:与系统硬件和软件有关的配置文件
	media:关盘、软盘挂载点
	mnt:其他临时分区的挂载点
	proc:内存文件系统
	sbin:根用户用于系统管理的可执行文件
	tmp:临时文件
	var:各种服务器的数据文件、日志、假脱机打印系统的打印队列数据等
2.Linux的在线帮助系统
(1)查看文档的命令
	cat、more(只能向下翻)、less(上下都能翻)
(2)Linux的帮助系统:
	手页册:man command
	语法:
    	man+(选项)+参数
	选项:
		-a:在所有的man帮助手册中搜索;
		-f:等价于whatis指令,显示给定关键字的简短描述信息;
		-P:指定内容时使用分页程序;
		-M:指定man手册搜索的路径。
	section:
		1 - commands    //普通的命令
		2 - system calls  //系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)
		3 - library calls  //库函数,如printf,fread
		4 - special files  //特殊文件,也就是/dev下的各种设备文件
		5 - file formats and convertions  //指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
	    6 - games for linux  //给游戏留的,由各个游戏自己定义
		7 - macro packages and conventions  //附件还有一些变量,比如向environ这种全局变量在这里就有说明
		8 - system management commands  //系统管理用的命令,这些命令只能由root使用,如ifconfig
		9 - 其他
		想要指定section就直接在man的后面加上数字,比如: man 1 ls
	info命令				
3.基本shell命令
ls:获取目录中的文件列表(文件权限)
mkdir、rmdir:新建目录、删除目录
cd:切换目录
pwd:查看当前目录
touch:新建文件/刷新文件时间
mv:问件改名/移动
cp:复制文件
rm:删除文件
who:确定系统当前用户的信息
ps:列出系统当前进程   ps-aux //列出系统所有进程
pstree:列出系统进程树
top:动态显示系统当前进程
date:显示和设置系统当前日期和时间
grep:查找文本中的字符串
clear:清屏
echo:回显命令
find:文件搜索命令
wc:文字统计工具
bc:计算器工具
head、tail:显示文件的前几行和后几行
3.压缩/解压命令
(1)用gzip压缩/解压缩
	tar -czvf k.tar.gz *
	tar -xzvf k.tar.gz
(2)归档并用bzip2压缩/解压缩
	tar -cjvf k.tar.bz2 *
	tar -xjvf k.tar.bz2

三、工具链概述

1.嵌入式系统软件开发流程
	高级语言编写的源代码文件——>交叉编译器——>目标文件——————————————
                                                                  |
	                                                            链接器——>可执行程序——>目标机平台
																  |
	用目标机的汇编语言编写的源代码文件——>交叉汇编器——>目标文件————
2.GNU Tools是Linux环境下最主要的开发工具集,主要有以下几部分:
编译开发工具:把源程序编译为可执行文件,如gcc。
调试工具:对可执行程序进行源码或汇编级调试的软件,如gdb。
软件工程工具:用于协助多人开发或大型软件项目管理的软件,如make等。

四、编辑器vi/vim

链接: link.

五、gcc的简介与使用

链接: link.

用gcc编译程序时,分为四个阶段         分步编译源程序
预处理(pre-processing)				gcc -E hello.c -o hello.i
编译(compiling)						gcc -S hello.c -o hello.s
汇编(assembing)						gcc -c hello.c -o hello.o
链接(linking)						gcc hello.c -o hello
1.常用选项
-ansi			只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,例如 asm 或 typeof 关键词。
-c				只编译并生成目标文件。
-DMACRO			以字符串"1"定义 MACRO 宏。
-DMACRO=DEFN	以字符串"DEFN"定义 MACRO 宏。
-E				只运行 C 预编译器。
-g				生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY		指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY		指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY		连接时搜索指定的函数库LIBRARY。
-m486			针对 486 进行代码优化。
-o FILE			生成指定的输出文件。用在生成可执行文件时。
-O0				不进行优化处理。
-O 或 -O1		优化生成代码。
-O2				进一步优化。
-O3				比 -O2 更进一步优化,包括 inline 函数。
-shared			生成共享目标文件。通常用在建立共享库时。
-static			禁止使用共享连接。
-UMACRO			取消对 MACRO 宏的定义。
-w				不生成任何警告信息。
-Wall			生成所有警告信息。
2.gcc的使用
gcc -v  		查看gcc版本
gcc f1.c -o f2 (gcc f1.c(生成的程序为a.out))
3.gcc的库依赖
(1)函数库:头文件(.h)+库文件(.so、.alias)
(2)系统能够识别的默认路径:
	头文件:/usr/include
	库文件:/usr/lib
(3)使用非默认路径的文件需在编译时指定路径
	头文件用 "-l"
	库文件用 "-L",-l后的参数指明要寻找库

六、gdb调试器

要使用gdb调试程序,在用gcc编译源文件时要指定 -g 选项,以使程序中包含必要的信息。

七、make/makfile

1.makefile结构分析
目标文件:依赖文件
[tab]生成规则	
2.在Linux命令提示下输入make:
(1)make会在当前目录下按顺序寻找GNUmakefile,makefile,Makefile
(2)如未找到则报错,如找到,则把第一个目标作为最终目标
(3)按照“堆栈”顺序,依续找到每一个目标文件,判断新旧关系,必要时生成新的目标文件,知道生成最终目标(可执行文件)
(4)寻找过程中,如某依赖文件不存咋,则make直接退出,并报错
(5)标号不会被关联到,所以不会自动执行,而必须通过命令行指定参数才能执行
(6)如改变了源文件,与之相应的.o文件和最终目标文件都要重新编译,但只需在Linux命令提示符下键入make即可

补充:

关于int main(int argc,char* argv[])详解
	argc是命令行总的参数个数   
	argv[]为保存命令行参数的字符串指针,其中第0个参数是程序的全名,以后的参数为命令行后面跟的用户输入的参数,argv参数是字符串指针数组,
	其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。指针数组的长度即为参数个数argc。数组元素初值由系统自动赋予。
	关于argv[2][0]:是你调用的参数列表。当你使用命令行调用你写的可执行程序的时候,会传入参数,一般参数都会当做字符串处理,
	  因为你的argv是字符类型的数组,一个字符串是一个一维字符数组,那么多个参数就可以看做一个字符串数组,也就是字符的二维数组了。
	  argv[2][0]其实指的是传入的第2个参数的第1个字符。

Linux命令大全

链接: link.

你可能感兴趣的:(Linux,C,linux,c语言)