linuxC高级_day2
学生管理系统:
1.添加 2.查询 3.删除 4.排序 5.查找 6.退出
1. 向班级里添加学生 -- 班级、学生
2. 输入学生的名字可以删除学生(重名一起删除)删除学生之后
后面的学生要移动到前面来
3. 排序 按照学生成绩排序
4. 输入学生的姓名可以修改学生的年龄和成绩 -- 学生结构体:年龄 成绩
5. 查找 输入姓名 显示信息
学生结构体:
typedef struct
{
char name[15];
int age;
float score;
}student_t;
班级结构体:
typedef struct
{
int n; // 实际有多少个学生 0<=n<=30
student_t stu[30]; //如果比30大 就不能忘里面添加了
}class_t;
enum
{
ADD=1,
DEL,
SHOW,
SORT,
MOD,
QUIT,
};
#define MAX 30
【1】C基础
student.h(add.h)
#ifndef __STUDENT_H__
#define __STUDENT_H__
#endif
#include <stdlib.h>
void *malloc(size_t size); 申请内存空间
int *p = (int *)malloc(4);
void free(void *ptr); 释放空间
【思考】
1. malloc函数 搞懂 - 传入的参数class_t , *cls行不行?
2. 力扣去看题目 看看别人怎么使用malloc
3. scanf输入之后 回车字符要不要处理?
4. 退出是直接返回好 还是写个函数好 还是goto处理错误好
5. 如果我输入垃圾字符后怎么判断,
如果直接退出了我的垃圾字符是不是存在缓冲区里?需要清空吗?
指针自身的类型 和指针指向的变量的类型不是一件事
从定义分析
int p 整型变量
int *p 先和*结合说明我是指针 再和int结合说明指针指向是int类型的
p是一个指向整数类型的指针
int p[3] 先和中括号结合说明我是个数组 再和int结合 说明我数组里放的元素是int型
p是一个存储整型数据的数组
int * p[3] 先和中括号结合说明我是个数组([]优先级比*高) 再和*结合说明我数组里面的元素是指针类型 再和int结合说明 数组里的指针指向的元素是整型的
p是一个存储 指向整型的指针的数组
int (*p)[3] 先和*结合(因为小括号优先级高) 说明p是一个指针
再和[]结合 说明p指向了一个数组
再和int结合 说明数组里的元素都是int型
p是一个指向由整型数据组成的数组的指针
int **p 先和第一个*结合说明我是一个指针
再和第二个*结合说明指针指向的内容还是个指针
最后再和int结合 说明指针指向的内容是个int型
int p(int) -- int funA(int a) p先和()结合说明是个函数
进入小括号看传入的参数是int类型 跳出来看发现我返回值是个int类型
int (*p)(int) p先和*结合说明p是个指针 再和小括号结合 说明p指向了一个函数
指针的类型 声明语句中去掉我的指针名字 剩下的就是指针的类型
int *p -- int *
char *p -- char *
int **p -- int **
int(*p)[3] -- int(*)[3]
int*(*p)[3] -- int*(*)[3]
指针指向的类型 去掉声明语句中指针的名字和最靠近他的* 就是我指针指向内容的类型
int *p -- int
char *p -- char
int **p -- int *
int(*p)[3] -- int()[3]
int*(*p)[3] -- int*()[3]
【0】 网络配置
1. IP网络主机中的唯一标识(window-ipconfig Ubuntu-ifconfig)
2. 组成: 网络号 + 主机号
192.168.3. 112 -- 点分十进制 (192.168.3.255是这个网段的广播地址)
3. IPv4(32byte 2的32次方大概4G) --不够用-- IPv6(128)淘宝京东都支持了
为什么耗尽了还能使用? - 总有空闲
4. A 政府机构 0.0.0.0 - 127.255.255.255
B 中等规模的公司 128.0.0.0 - 191.255.255.255
C 任何需要的人 192.0.0.0 - 223.255.255.255
D 组播 224.0.0.0 - 239.255.255.255
E 实验 240.0.0.0 - 255.255.255.255
5. 子网掩码 获取网络号的 255.255.255.0 & 192.168.3.112 = 192.168.3.0
6. 网关 -- 习惯用路由当成网关 192.168.3.1
7. DNS -- 域名解析器 把域名转化为IP地址
www.baidu.com -->ip
免费的域名解析器
114.114.114.114
8.8.8.8
* 8.Ubuntu设置网络
a. /etc/network/interfaces
b. sudo service netwrok-manager restart
【1】配置tftp和nfs
*(rw,sync,no_subtree_check,no_root_squash)
* 所有用户
rw 可读可写的权限
no_subtree_check 不检查子目录的权限
【2】 文件的压缩和打包
1. windows下面的压缩软件 (7zip rar)两个工作: 打包-压缩
2. 压缩的对象是文件不是目录
压缩 / 解压
.gz -- gzip/gunzip
.bz2 -- bzip2/bunzip2
.xz -- xz/unxz
压缩原理: 删除一些空格和换行之类的
压缩速率: gzip > bzip2 > xz --- 用时
压缩率 : gzip < bzip2 < xz --- 压缩之后所占的大小
ls -lh可以查看文件的详细信息和大小
gzip COPING(文件名) --- gunzip COPINT.gz(对应的压缩包名)
a. 压缩之后源文件不存在 解压之后压缩包也不存在了
b. gzip压缩的不能用其他命令解压 并且后缀就只能是.gz
c. xz压缩之后比bzip2还大? -- xz压缩的对象要在100M以上才能体现压缩率
d. 不能对文件目录进行压缩! 会被忽略ignore
3. 打包的对象是目录 - tar(打包-拆包)
tar命令
tar -c 打包(creat)
tar -x 拆包
tar -f 文件名(一定放在最后一个)
tar -v 显示过程
创建一个文件夹 haha(打包之后是一个文件 打包之后源目录存在)
对haha进行打包 tar -cf haha.tar haha/
对haha.tar拆包 tar -xvf haha.tar
文件夹 - 打包 - 压缩 - 解压缩 - 拆包 - 文件夹 === 打包并且压缩 怎么办?
-z : gzip方式压缩
-j : bzip2方式压缩
-J : xz方式压缩
对haha打包并且以gzip方式压缩
tar -czvf haha.tar.gz haha/
tar -xzvf haha.tar.gz
对haha打包并且以bzip2方式压缩
tar -cjvf haha.tar.bz2 haha/
tar -xjvf haha.tar.bz2
对haha打包并且以xz方式压缩
tar -cJvf haha.tar.xz haha/
tar -xJvf haha.tar.xz
(X)tar -cjvf hello.tar.xz -- 不会报错 但是大小有问题
(X)hello.tar.xz -- -xJvf但是实际上是用-cjvf压缩的
万能拆包: tar -xvf
【3】 文件相关的命令
1. 创建
touch 文件名
文件存在更新时间戳
2. 删除
rm 文件名
删除除了2.c以外的所有目录和文件
rm !(2.c) -rf
3. 重命名
mv 旧文件名 新文件名
4. 移动
mv 文件名 新的路径
5. 复制
cp 文件 路径
6. 进入文件夹
cd
7. 查看文件目录下的内容
ls -i -l -a -lh
8. 查看文件内容
cat:
cat 文件名
cat -n 文件名
head:
head 文件名 //默认显示前十行
head -n行 文件名 //显示前n行
tail:
tail 文件名 //默认显示后十行
tail -n行 文件名 //显示后n行
tail /etc/passwd
linux: x: 1000: 1000: linux,,,: /home/linux: /bin/bash
用户名: 有密码: 用户ID : 组ID: 登录时候的名字: 家目录 : 命令解析器
【练习】 查看文件的第34行 就看passwd文件的34行
head -34 /etc/passwd | tail -1
linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
顺便看看行号
cat -n /etc/passwd |head -34| tail -1
34 linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
9. 查看文件格式 file
file /bin/ls
file a.out
10. 查看文件大小 wc
wc -l 文件名 //line行数
wc -c 文件名 //char字符数
wc -w 文件名 //word单词数
11. 搜索grep
grep "字符串" 文件 参数
-n 显示行号
-R 递归搜索
-i 忽略大小写
-w 按照单词精确搜索
grep "typedef" * -nR //搜索所有的文件包括子目录并显示行号
【练习】 1.搜索main - 把其中给一个改为Main
grep "main" * -nRw 精确查找
grep "main" * -nRi 忽略大小写
^匹配开头 $匹配结尾
2. /^main 找到以main开头的
/main$ 找到以main结尾的
/^main$ 找到以main开头并且结尾的 这一行只能有这个单词
vim里面 n下一个 N上一个
3. Linux用户是不是存在 如果存在就显示信息
12. 文件的查找 find
find 路径 -name 文件名
find ./ -name passwd 从当前路径下向子目录搜索有没有passwd文件
13. 文件的裁剪 cut
cut -d 分隔符 -f 域
cut -d ":" -f 1,3 addr.txt
【练习】 将linux用户的id和家目录截取出来,并且显示行号
grep "^linux" passwd -nw | cut -d ":" -f 1,2,7
14. 文件属性的修改
1)文件类型7种: bsp-lcd
b: 块设备驱动文件block
s: 套接字文件 socket
p: 管道文件 pipe
-: 普通文件
l: 链接文件 link
c: 字符设备文件 char
d: 目录
2)用户的权限
rw- 用户的权限
rw- 组的权限
r-- 其他用户的权限 ---664
r: 可读
w: 可写
-: 没有权限
x: 可执行
chmod 664 文件名
【笔试题】 给一个文件加上该用户的可执行权限 并且不改变其他的权限
chmod u+x 文件名 chmod u-x 文件名
u: 用户
g: 组
o: 其他用户
a: ugo -- 表示全部
+: 给权限
-: 去权限
15. 链接 ln
软连接 ln -s (符号链接) 使用文件的路径名进行创建,所以一般使用绝对路径,可以增大可移植性
ln -s 被连接的文件(源文件) 生成的链接文件(目标文件)
1. ls -l软链接的文件类型是l
2. 修改任何一边另一个文件也随之变化
3. 如果我的链接文件删除之后 源文件依然存在
4. 如果我的源文件删除,软连接断开,再次创建源文件之后,链接恢复
硬链接 ln 位文件分配一个物理编号通过iNode号进行链接
ln 被连接的文件(源文件) 生成的链接文件(目标文件)
1. ls -l软链接的文件类型是-(普通文件)
2. 源文件删除的话,硬链接文件依然存在,链接依然可用
3.硬链接不能链接目录,软连接可以
【4】 磁盘相关的命令
1. sudo fdisk -l 查看磁盘分区情况
2. sudo df -h 查看分区使用率
【5】 进程相关命令
1. ps:
ps aux : 查看系统的进程 经常和grep连用
ps -ef : 查看系统进程显示父进程号
进程的状态man ps:PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S")
will display to describe the state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent.
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group.
2. top 动态查看进程
q: 退出
shift + >: 向下翻页
shift + <: 向上翻页
3. kill 发送信号
kill -l : 查看所有的信号
kill -9 PID : 杀死进程
kill PID : 默认发送的是15
*4. nice renice改变进程的优先级
优先级号越小说明优先级越高