Linux小结

Linux

第一章、Linux常用指令

帮助命令:

man,help,info

文件系统命令

Linux文件类型:
  • 普通文件
  • 目录文件
  • 符号链接文件
  • 设备文件
  • 管道文件
  • Socket文件
文件系统目录结构

分层树形结构

主目录(/home/用户名)和当前目录(任意时刻,当前用户所在的目录)
一些指令:文件系统命令

ls pwd cd mkdir rmdir mv rm wc find grep gzip gunzip tar

文件存取权限

三种权限:
+ 读read(r)
+ 写write(w)
+ 执行execute(x)。

文件用户分为三种类型
+ 文件的所有者(user)
+ 群组(group)
+ 其他人(others)

用三个位来表示该类用户的文件存取权限,因此每一类的文件用户可以有8种可能的操作权限。

改变文件或目录的存取权限命令chmod

更改文件或目录的所有者命令chomd

挂载:

mount,umount:分别用于挂载、卸载指定的文件系统。

系统管理常用命令

ps kill command command& fg bg 输入重定向(<) 输出重定向(>) 管道命令(|) passwd date whoami hostname uname useradd

网络操作常用命令

ifconfig ifup ifdown ping netstat arp telnet ftp

网络安全常用命令

su chmod chown ps who top free kill &

字符串显示命令

echo

Shell的环境变量

  • 更改shell环境变量的值我们在初始化文件/etc/profile 和/etc/csh.cshrc中更改
  • shell元字符
    字符?是一个匹配任何单个字符的通配符。
    字符*则匹配0个或者多个字符。
    符号[]表示区间中的任一字符。

命令行的执行方式

  • 命令的顺序执行
  • 命令的并发执行
  • 命令行中&&操作
  • 命令行中||操作

安装软件

  • 使用rmp命令 rpm命令格式:rpm [参数] 软件包
  • 在应用商店安装软件

第二章、Shell编程

shell程序的位置参数

  • 位置参数,内部参数(&0,&1-&9,&*,&@,&#,&?,&&)
  • 位置参数的设置
    set [option] argument_list
    用argument_list中的值来设置位置参数、标志、选项和位置参数

  • 设置环境变量和用户自定义变量

  • 变量的声明和赋值
    Bash中可以不声明变量,也可以使用declare和typeset来申明。
    赋值: 格式:variable=value
    注意等于号"="前后没有空格,如果一个值包含空格,则必须包含在引号中,等于号对整形变量只能给整形值,不能给非整形值。
  • 变量引用:shell中在变量名前面加一个$字符来访问它的内容

  • 变量引用和引号使用:一般情况下,脚本文件中的参数异空白字符分隔(如空格、制表符或换行符),如果一个参数中包含空白字符,就必须加上引号。使用双引号可引用除"$"、"'"和"\"外的任意字符或字符串。单引号将值括起来不允许变量替换。反斜杠()可以用来去除某些字符的特殊意义

  • 命令替换:$(command),将command结果输出
  • 输入变量 read [option] variable-list

控制结构语句

  • 顺序结构语句
  • if语句
  • for语句
  • while语句
  • until语句
  • case语句
  • 其他语句:
    例如:break和continue语句 exit语句

数值处理

Linux的bash变量的值是以字符串格式存放的,要进行算法逻辑运算就必须转换为整数。
+ let命令
+ $((expression))扩展
+ expr命令

数组

  • 声明数组
    Array[key]=value array=(value1 value2 value3 …) array=([1]=one [2]=two [3]=three …)
  • 数组的访问
    array[key]: a r r a y [ k e y ] : {array[1]}
  • 数组的删除
    unset array[1]
    unset array
  • 计算数组的长度
    {#array} {#array} {#array[0]} {#array[\*]} {#array[\*]} {#array[@]}
  • 数组的提取
    ${array[@]:n:m] 提取数组n与m之间的元素
  • 函数
    格式
    函数格式如下:
函数名(   )
{
  函数体
}
  • 调用:
    函数名 参数列表

第三章、Linux系统C开发工具

gcc编译器

  • 支持的后缀名:.c .C .cc .cxx .m .i .ii .s .S .h .o .a/.so
  • gcc指令格式:gcc [options] filename-list
  • 常用选项有:
-ansi        -c         -g         -l

-m           -o         -O         -pg

-S           -v         -w         -W
  • gcc编译流程:
    源代码-》预处理(-E .i)-》编译(-S .s)-》汇编(-c .o)-》链接(-o )-》可执行文件

编译c语言程序

  • gcc编译器的主要参数
-c   生成目标文件(.o)
-S    生成汇编文件(.s)
-E    预编译
-g     在执行代码中包含调试信息
-o   file   把文件输出到file中
-v    显示gcc版本信息
-I dir  在头部文件的搜索路径中添加dir目录
-L dir  在库文件的搜索路径中添加dir
-static  链接静态库
-llibrary 连接名为library的库文件
  • 优化参数:
    gcc提供的代码优化功能非常强大,它通过编译参数"-On"来控制优化代码的生成,其中n是一个代表优化级别的整数。
  • 函数库
    函数库是一组预先编译好的函数的集合,标准系统库文件一般存放在Linux文件系统/lib和/usr/lib目录中。库文件的名字以lib开头
  • 静态库
    程序需要使用函数库的某个函数的时候,必须包含一个声明该函数的头部文件。使用gcc –c 自己的程序进行编译后再使用ar建档就可以创建自己的静态库。
  • 动态库

make工程文件

  • make命令
    make命令格式: make [选项] [make工程文件]
    常用选项:
-d    -f    -n    -s
  • make规则
    make默认的文件名是GNUmakefile,makefile和Makefile,也可以在命令行中指定别的文件名,多少程序员都选用Makefile。
  • Makefile中的变量
    Makefile中的变量就像环境变量。只要一行开始写变量名后面跟一个等于号"="以及要设置这个变量的值,就定义了变量,如: VARNAME=string
    把变量用花括号括起来前面加个 : 就 可 以 引 用 变 量 的 值 : {VARNAME}
  • make工作执行步骤:
1. 读入所有的makefile文件。
2. 读入被include包括的其他makefile文件。
3. 初始化文件中的变量。
4. 推导隐式规则,并分析所有规则。
5. 为所有的目标文件创建依赖关系链。
6. 根据依赖关系,决定哪些目标要重新生成。
7.  执行生成命令。
  • gdb调试

第四章、Linux环境下的系统函数的使用

    一)、数学函数的使用

sqrt rand srand等等

    二)、字符函数的使用

            isalnum isalpha isascii等等

    三)、系统时间与日期函数的使用

            1)、普通函数

Asctime Ctime Gettimeofday Gmtime Localtime等等

            2)、结构体tm

                    struct tm

{

int tm_sec ; /*代表目前秒数,正常范围为0-59,但允许至61秒*/

int tm_min ; /* 代表目前分数,范围0-59 */

int tm_hour ; /* 从午夜算起的时数,范围为0-23 */

int tm_mday ; /* 目前月份的日数,范围01-31 */

int tm_mon ; /* 代表目前月份,从一月算起,范围从0-11 */

int tm_year ; /* 从1900 年算起至今的年数*/

int tm_wday ; /* 一星期的日数,从星期一算起,范围为0-6 */

int tm_yday ; /* 从今年1月1日算起至今的天数,范围为0-365 */

int tm_isdst ; /* 日光节约时间的旗标*/

};

            3)、结构体timeval

                    struct timeval{

long tv_sec; /*秒*/

long tv_usec; /*微秒*/

};

            4)、结构体timezone

                    struct timezone

{

int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/

int tz_dsttime; /*日光节约时间的状态*/

};

    四)、环境控制函数

            getenv  putenv/setenv

    五)、内存分配函数

            calloc  malloc  getpagesize  mmap  mummap

    六)、数据结构中常用函数

            Bsearch  lfind  lsearch  qsort
  1. 第五章、 文件IO操作

一)、Linux系统文件和文件系统

文件除了包含内容外,还包含文件名和一些属性(即"管理信息":文件创建/修改日期、访问权限、文件长度及在磁盘上存放位置)。 这些属性保存在文件的inode (索引节点)中。系统使用的是文件的inode编号

            1)、文件类型:

普通文件(-)、目录文件(d)、符号链接文件(l)、字符设备文件(c)、块设备文件(b)、管道文件(p)、socket文件(s)等

2)、Linux文件权限

S_IRUSR 所有者具有读权限

S_IWUSR 所有者具有写权限

      S\_IXUSR 所有者具有执行权限

       S\_IRGRP 组具有读权限

         S\_IWGRP 组具有写权限

         S\_IXGRP 组具有执行权限

         S\_IROTH 其他用户具有读权限

         S\_IWOTH 其他用户具有写权限

         S\_IXOTH 其他用户具有执行权限

3)、结构体stat

    二)、不带缓存的文件I/O操作

不带缓存的文件I/O操作包括系统调用或API的I/O操作,是由操作系统提供的,符合POSIX标准,设计的程序能在各种支持POSIX标准的操作系统中方便移植。

            1)、一般函数:

                    creat、open、close、read、write、lseek、flock、fcntl

2)、文件的非阻塞操作

文件的读写操作中还有一个阻塞和非阻塞问题。非阻塞打开文件时用flags的一个值O_NONBLOCK来表示,read/write就不会阻塞。

要让文件非阻塞操作时,设置flag |=O_NONBLOCK

要让文件阻塞操作时,设置flag &=~O_NONBLOCK

    三)、带缓存的流文件I/O操作

带缓存的流文件I/O操作称为标准I/O操作,符合ANSI标准。在内存中开辟了一个缓存区,为程序中的每一个文件使用。带缓存的件I/O操作比不带缓存的I/O操作程序更方便移植。

            1)、主要函数:

fopen、fclose、fread、fwrite、fseek、ftell、rewind、fgetc、fputc、fgets、fputs

    四)、命令行参数和特殊文件操作

1)、向程序传递参数

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

            2)、一些函数:

                    getopt  getopt\_long

    **第六章、进程控制**

一)、什么是进程

一个其中运行着一个或多个线程的地址空间和这些线程所需要的

系统资源,每个运行着的程序实例构成一个进程,进程是由程序代码,数据,变量(占用着系统内存),打开的文件(文件描述符)和环境组成

    二)、进程的结构

            正文段,用户数据段,系统数据段

            1)、进程表

它把当前加载到内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、命令字符串和其他一些PS命令输出的各类信息,OS通过进程的PID对它们进行管理

            2)、查看进程

                    ps指令

            3)、进程调度

                    nice(  )                     改变一个普通进程的优先级

getpriority( ) 取得一组普通进程的最大优先级

setpriority( ) 设置一组普通进程的优先级

sched_getscheduler( ) 取得一个进程的调度策略

sched_setscheduler( ) 设置一个进程的调度策略和优先级

sched_getparam( ) 取得一个进程的调度优先级 sched_setparam( ) 设置一个进程的优先级

sched_yield( ) 不阻塞的情况下自愿放弃处理机

sched_get_ priority_min( ) 取得某种策略的最小优先级

sched_get_ priority_max( ) 取得某种策略的最大优先级

    三)、启动新进程

            1)、一些函数:

调用库函数system()

                    fork  wait  waitpid

            2)、僵尸进程

                    fork调用之后子进程便有一个父进程,有两种情况:

父进程先于子进程终止,init进程接管该子进程(孤儿进程)。

子进程先于父进程而终止,退出的进程被置于僵死态,占据内核维护的进程控制表中的一项,但不使用其它的内核资源,即该进程成为一个僵死进程。

  1. 3)、僵尸进程解决办法

    通过信号机制

通过调用fork两次避免僵死进程原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程

学习体会:

    我们知道Linux在服务器端的占比超过90%,尤其是web端,几乎所有公司的后台全部都是Linux的系统。Windows由于成熟的图形界面而在pc端风光无限,但是服务器由于其较高的并发以及cpu负荷较高,windows无法负担,Linux便很适合。我认为学习Linux不仅仅是深入连接Linux那么简单,因为Linux的终端概念,我对cmd也有了更深的理解,它是一个shell外壳,翻译指令给内核。Linux有shell脚本,windows有bat批处理文件,使用了这么久的windows,我完全没有想过这些问题。我对c/c++比较感兴趣,在windows下IDE的过度使用,对编译和调试的理解虽然知道有gcc,g++,gdb之类的东西,但是没有实际操作过,理解很浅。学习了Linux,我也知道了编译c/c++的完整过程,也算是深刻理解吧。我之前接触过cmake,知道它是一种跨平台的工具,在Linux中生成makefile文件,在windows中产生sln文件等等,学习makefile也算是对先前的知识做一个强化理解。今后的学习我们将更多的涉及操作系统方面的知识,比如文件操作,进程,线程,进程通信等等。学习Linux的意义不仅仅是Linux,而是和Linux相关,和操作系统相关,和c/c++相关的一系列知识。

难点疑点:

1)、说实话,vim是一大利器,但是熟练掌握vim的代价太高了,vim的主要吸引点是它能真正解放鼠标,使我们编程速度有个个质的飞跃,但是掌握vim的快捷键太难了,vim配置也相比较IDE麻烦。

2)、C语言,我们虽然之前学过C语言,但是我们的学习说实话是停留在windows的黑框界面中,停留在语法,数据结构,算法上,没有落实到操作系统,没有落实到进程,线程等计算机真正相关的领域,没有一个整合和过程。我们希望通过Linux这门课程,我们可以对c语言的认识不仅停留在这是一门语言上,而更多的是认识这是一门编写了linux,unix的语言,这是一门面向操作系统,面向底层的语言。

3)、进程以及线程的概念。因为我们没有立体接触过,比较生疏,理解还是需要时间的。

Linux内存管理是一个复杂的系统,它涉及到物理内存和虚拟内存的协调。以下是一些关键概念和小结: 1. **物理内存(Physical Memory)**:这是直接与硬件打交道的部分,包括RAM(随机存取存储器)和交换空间(Swap Space)。Linux使用分页或段式内存管理来分配和回收物理内存。 2. **虚拟内存(Virtual Memory)**:虚拟内存允许进程使用比实际物理内存大的地址空间。它通过页面替换算法(如LRU、FIFO等)将部分数据移到磁盘上以释放物理内存。 3. **页表和页帧**:Linux使用页表来映射虚拟地址到物理地址,页帧是物理内存中的基本单位。 4. **内存分配**:Linux使用slab cache机制进行内存分配,提高了内存分配和回收的效率。还有zone-based memory allocator,按内存大小和类型划分区域。 5. **内存碎片**:长时间的内存分配和回收可能会导致碎片,Linux通过 buddy system 和 zone-based 分配策略来尽量减少碎片。 6. **内存管理工具**:`free`、`top`、`vmstat`、`pmap`、`/proc/meminfo`等工具帮助监控和分析内存使用情况。 7. **交换分区**:当物理内存不足时,Linux会将部分进程的页面移到交换空间,但相比直接访问物理内存,这会带来性能损失。 8. **内核调优**:通过调整`vm.swappiness`参数、限制某些进程的内存使用,以及优化内存相关的内核参数,可以优化内存管理性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值