LinuxC 第一篇

学习内容:

  1. shell命令
  2. shell脚本
  3. C高级(结构体、共用体、枚举、函数指针、指针函数、自定义头文件、make工程管理)

day1

  1. 结构体
    1.  概念

一类相关事物属性的集合,是一种自定义的数据类型

    1.  定义

struct 结构体名

{

属性1;

属性2;

......

属性n;

};

描述一个人的姓名、年龄

struct people

{

char name[20];//姓名

int age;//年龄

};

定义了一个结构体,结构体的数据类型为(struct people)struct 结构体名

    1.  初始化

int a =10;//初始化  数据类型 变量名 =  初值;

int a;

a = 10;//赋值

数据类型 变量名 = {............};

struct people pe = {“zhangsan”,18};

    1.  访问
  1. 通过结构体变量来访问

结构体变量.成员

案例:将结构体的值赋值给另一个结构体

  1. 通过结构体指针来访问

指针变量名->成员

整型指针:指向整型的指针

数组指针:指向数组的指针

结构体指针:指向结构体的指针

数据类型 *指针变量名;

struct people * p = NULL;   sizeof(p) = 4byte

    1.  字节对齐

一次性分配多少个字节

自然对齐方式(32OS):

int:4字节对齐

short:2字节对齐

float:4字节对齐

double:占8个字节,分配的时候还是按4字节分配,分配两次

char:1字节对齐

选成员中最大的那个对齐

节省结构体空间的办法:

  1. 将数据类型大的放到最前面
  2. 位域/位段

未优化之前:

优化之后

    1.  结构体的嵌套

作业:

  1. 定义一个结构体,描述学生的姓名、年龄、三门成绩,实现输入输出
  2. 编写一子函数,查找指定字符在字符串中第一次出现的地址
  3. 编写一子函数,查找指定字符在字符串中最后一次出现的地址

1.7 给结构体取别名

方式1:

方式2:

注意:用的最多的就是方式2

1.8 结构体数组

概念:元素为结构体的数组

数据类型 数组名[元素个数];

Stu stu[3];

day2

  1. malloc函数

头文件:#include <stdlib.h>

void *malloc(size_t size); //void *:任意类型的指针

函数功能:申请空间

参数:要申请的空间的大小

返回值:成功返回申请到的空间的首地址,失败返回NULL

注意:(1)malloc申请到的空间是没有名字的

     (2)malloc申请到的是一片连续的内存空间

void free(void *ptr);

函数功能:释放空间

参数:申请到的空间的首地址

//描述一个学生的姓名、年龄、三门成绩

#define N 20

#define M 3

#define SIZE 3

typedef struct student

{

char name[N];//姓名

int age;//年龄

float scores[M];//三门成绩

}Stu;

用malloc申请SIZE个Stu这么大的空间

  1. memset

头文件:#include <string.h>

void *memset(void *s, int c, size_t n);

函数功能:重置内存空间

参数1:要重置的内存空间的首地址

参数2:要重置的值

参数3:要重置的内存空间的大小

案例:

  1. 对ps指向的空间进行输入输出(用子函数的形式实现)

  1. 求年龄最大人的首地址

  1. 根据年龄进行排序

  1. 根据姓名进行排序
  2. 根据三门成绩总和进行排序
  1. 自定义头文件

.h文件

“” :编译器从用户的工作路径搜索头文件

<> :编译器从标准库路径(/usr/include)搜索头文件

  1. 文件编译

作用:防止头文件重复定义

#ifndef 文件名(将文件名大写,所有的.换成_)

#define 文件名

#endif

day3

  1. gcc工作原理

gcc的编译流程:预处理(处理以#开头的文件)、编译(生成了汇编语言)、汇编)(将汇编语言转成机器代码)、链接(与其它机器代码整合,生成可执行的二进制代码)

方法1:

预处理:gcc -E main.c -o main.i

编译:gcc -S main.i -o main.s

汇编:gcc -c main.s -o main.o

链接:gcc main.o -o main

方法2:

将gcc的前四步合四为一:gcc  main.c  -o  main

  1. 多文件编译(解决单独编译出错的问题)

2.1 将gcc的前三步合3为1

gcc  -c  stu.c  -o  stu.o

gcc  -c  io.c  -o  io.o

gcc  -c  sort.c  -o  sort.o

gcc  -c  sumScores.c  -o  sumScores.o

gcc  -c  swap.c  -o   swap.o

gcc  -c calPmaxAge.c  -o  calPmaxAge.o

2.2 将所有的.o文件链接生成可执行文件

gcc stu.o io.o sort.o sumScores.o swap.o calPmaxAge.o -o stu

  1. make工程管理

make命令会在当前路径下找一个叫做Makefile(M大写或小写都可以)的文件

3.1 Makefile命名规范

目标文件1:依赖文件1

(Tab键)依赖文件1如何生成目标文件1

目标文件2:依赖文件2

(Tab键)依赖文件2如何生成目标文件2

注意:

  1. 如果两个目标之间没有联系,默认执行目标文件1
  2. 一个Makefile中可以有多个目标
  3. 调用make命令时,必须指定要执行的目标,如果没有指定目标,默认执行目标文件1

注意:make之后会在构建yyds之前,先构建test

3.2 解决假目标

在clean前面加上.PHONY

注意: .PHONY必须使大写

3.3 预定义变量

CC:C编译器的名称,默认为CC

CFLAGS:c编译器的选项,无默认值

RM:程序删除的名称,默认为rm -rf

3.4 自定义变量

OBJ:用于存放可执行文件的名称

OBJS:所有的目标文件

3.5 自动变量

$@:表示目标文件

$^:表示所有的依赖文件

$<:表示第一个依赖文件

此处的$^ 指的是$(OBJS)

3.6 变量定义的方式

3.6.1 递归方式 VAR=var

注意:后面的值会影响前面的结果

3.6.2 简单方式 VAR:=var

3.7 嵌套Makefile

bin(可执行文件)、include(.h文件)、src(*.c文件)、obj(*.o文件)

(1)编写总控Makefile、书写自定义变量和预定义变量

(2)编写src中的Makefile,将所有的.c文件生成.o文件,并将所有的.o文件移动到obj目录中

  1. 编写obj中的Makefile,将所有的.o文件编译生成可执行文件,并将可执行文件移动到bin目录中

$<:表示第一个依赖目标,也就是$(OBJ)

此处的假目标ALL ,依赖于$(OBS)

(5)先执行src中的Makefile(make -C src),再执行obj中的Makefile(make -C obj)

Make -C $@   是一句嵌套makefile的语法,在一些大的工程中,我们会把

这是一句嵌套 makefile 的语法,在一些大的工程中,我们会把我们不同模块或是不同

功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的 Makefile,

这有利于让我们的 Makefile 变得更加地简洁,而不至于把所有的东西全部写在一个

Makefile 中,这样会很难维护我们的 Makefile,这个技术对于我们模块编译和分段编译有

着非常大的好处。

  1. 枚举

作用:使程序变得更加语义化

  1. 共用体+大小端

特点:所有成员共用同一块首地址(大小有成员中最大的那个决定)

判断是大端序还是小端序

方法1:

方法2:

day4

  1. 递归

给计算机制定规则,自己调用自己

5!

  5*4!               return 5 * 24

4*3!   return 4 * 6

3*2!         return 3 * 2

2*1!     return 2 * 1

1!   return  1

案例:实现斐波那契数列(求前10项)

1  1  2  3  5  8  13  21

  1. 函数指针

定义一个指向int的指针:int *

定义一个指向char的指针:char *

定义一个指向数组的指针:int (*p)[3];

定义一个指向结构体的指针

struct student

{

char name[20];

int age;

};

struct student *ps = NULL;

定义一个指向函数的指针:

int add(int m,int n); //数据类型 int (int,int)

int (*p)(int,int) = NULL;//数据类型 int (*)(int,int)

案例:定义一个函数指针,该函数的返回值为float,有一个参数,该参数的数据类型为float

float (float)

float (*p)(float) = NULL;

案例2:定义一个函数指针数组,该数组有4个元素,每一个元素都是一个函数指针,该函数的返回值为int,参数有两个,分别为int型

int (*p[4])(int,int);

  1. 指针函数

返回值为指针的函数

  1. Linux的发展史

  1. shell

作用:负责用户和内核之间的交互

shell命令、shell、shell脚本的本质区别

shell命令:用户向系统内核发出的控制请求

shell:将用户命令解析为操作系统能识别的指令,实现用户与操作系统之间的交互

shell脚本:一堆命令的集合

5.1 shell的类型

Bourne Shell: 最早的Shell

C Shell

Ksh

Z Shell

Bourne-again shell(bash)

5.2 shell命令

命令 [选项] [参数]

注意:[]表示可以省略

选项:功能

参数:要操作的对象

注意:

  1. 一条命令的三要素之间要用空格隔开
  2. 若将多个命令书写在一行,用;将命令隔开

(3)如果一条命令不能在一行写完,用反斜杠(\)表明该命令未结束

5.3 用户系统相关命令

1、用户切换命令

su - 用户名

注意:用户的工作路径以及环境变量都会发生改变

注意:

(1)工作路径及其环境变量都未发生改变

(2)一般情况下不要切换成root用户,要使用root用户在最前面添加sudo

2、系统管理命令

ps:显示当前系统中该用户运行的进程列表

ps -ef:查看所有进程及其(PID)进程号

ps -aux:除了-ef显示的内容外,还会显示cpu的内存占用率、进程状态

top:动态显示系统中运行的程序

kill:发送信号给指定的进程

kill -l:列出所有可用的信号名称

3、磁盘相关命令

free:查看当前系统内存的使用情况

df:查看文件系统的磁盘占用情况

du:统计目录或文件所占磁盘空间的大小

fdisk -l:列出文件系统的分区情况

注意:必须使用root权限

4、文件、目录相关命令

Linux下有7中文件类型:

-:普通文件

d:目录文件

b:块设备文件

c:字符设备文件

p:管道文件

l:链接文件

s:套接字文件(socket文件)

4.1  chmod

作用:改变文件的访问权限

-rw-rw-r-- 1 linux linux   399 12月  1 18:24 fun_p.c

注意:第一个字母:表示文件类型

rw-       rw- r--

文件拥有者      用户所在组         其他人

修改文件权限的方式:

方式1:

u:文件拥有者

g:所属的用户组

o:其他人

a:所有人

+:表示增加权限

-:删除权限

=:设置权限

方法2:

注意:有权限用1表示,-表示没有权限,用0表示

rw-       rw- r--

文件拥有者      用户所在组         其他人

  110             110               100

  6                6                 4

-wx  r-x   rwx

011  101  111

4.2  chown

作用:修改文件所有者和组别

注意:必须使用root权限

修改文件所属用户:

修改文件所属组:

同时修改用户和组

4.3  chgrp

作用:修改文件所属组

4.4  grep

作用:在指定的文件中搜索特定的内容

grep 字符串 文件

-n :显示行号

4.5 查看文档

cat :适合看比较短的文档

more:适合看比较长的文档(按回车向下翻一行,空格向下翻一页,q退出)

less:加强版的more(回车向下翻一行,空格向下翻一页,支持上下箭头,q退出)

4.6 find

作用:在指定目录中搜索文件(若省略路径,默认为当前目录)

find -name 文件名

4.7 alias

作用:起别名(一次性的),想要永久生效的话添加到.bashrc文件中

5、特殊符号

` `:当作命令来处理

|:管道(一般不单独使用),将前一个命令的输出作为后一个命令的输入

通配符:

*:匹配任意长度的字符串(任意个字符)

?:匹配一个长度的字符(任意一个字符)

[…]:匹配其中指定的一个字符

[-]:匹配指定一个字符范围

[^…]除了其中指定的字符,均可匹配

> :输出重定向,如果文件不存在则新建,如果文件存在覆盖文件中内容

>>:追加重定向,如果文件不存在则新建,如果文件存在则追加在文件的末尾

wc -c :统计有多少个字符

wc -l :统计有多少行

< file:输入重定向,将file文件重定向为输入源

  1. 或&> :将产生的错误信息输出到文件中

  1. 硬链接和软链接

硬链接:利用Linux中为每个文件分配的物理编号,建立链接

创建硬链接:

软链接(符号链接):利用文件的路径名来建立链接

创建软链接:

区别:

硬链接会在用户选定的位置上生成一个和源文件大小相同的文件

软链接会在用户选定的位置上生成一个镜像文件,不会重复占用磁盘空间(平时使用最多的就是软链接)

相同点:

ln命令会保持每一处链接文件的同步性,不论改动了哪一处,其它的文件也会发生相同的变化

5.4 用户管理命令

相关配置文件

  1. /etc/passwd 系统能够识别的用户清单
  2. /etc/shadow 加密的用户清单
  3. /etc/group 组的名称和组中的成员列表

1、创建用户

sudo adduser 用户名

2、删除用户:

sudo deluser --remove-home 用户名

注意:删除的时候连同用户的主目录一起删除

3、修改用户密码

sudo passwd 用户名

  1. 创建组

sudo groupadd 组名

  1. 修改用户所属组

sudo usermod -g 目标组 要修改的用户

  1. 删除组

sudo groupdel 组名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值