Linux学习c高级:day2

这篇博客探讨了Linux系统管理的基础操作,如IP配置、文件操作、进程管理和磁盘管理。同时,深入讲解了C语言的指针、内存管理和结构体应用,以及学生管理系统的设计。内容涵盖添加、查询、删除学生,排序、查找和修改学生信息的实现思路。此外,还介绍了压缩和打包文件的方法,如gzip、bzip2和xz。
摘要由CSDN通过智能技术生成

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改变进程的优先级
       优先级号越小说明优先级越高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值