LinuxC高级_day2
【1】 学生管理系统
- 拆分文件
主函数文件 - 整体框架 - 调其他功能函数
接口文件 - 很多功能函数
头文件 - 结构体声明 函数声明 共同体 枚举 宏定义 - H文件 student.h
#ifndef STUDENT_H //防止头文件重复包含
#define STUDENT_H
#endif
- 主函数文件
#include <stdio.h> // 头文件放在/user/bin
#include “student.h” //先到自己的目录去找,找不到去/user/bin,自己定义的头文件用""
#include “…/stu/student.h” //可以加路径
测试:
class_t *cls = NULL;
cls = (class_t *)malloc(sizeof(class_t)); //cls *cls class_t
【2】 指针(指针的类型 指针指向的类型)
变量类型 * 变量名 //*没有取地址的功能,他只是表示这是一个指针变量,32位操作系统指针都是四个字节
char *p - sizeof§=4 sizeof(*p)=1
从定义区分
int p 整型变量
int p p先和结合说明是个指针再和int结合说明是指向的是int类型 p是一个指向整型数据的指针
int p[3] p先和[]结合说明是个数组再和int结合说明数组里的元素是int类型 p是一个整型数据组成的数组
int p[3] p先和[]结合([]优先级比高)说明是个数组,再和结合说明里面的元素类型是指针,再和int结合说明指针指向了int类型,p是个存放了指向int类型指针的数组
int (p)[3] 先和结合(小括号优先级高)说明是个指针,再和[]结合说明指针指向了一个数组,再和int结合,说明这个数组里的元素int类型,p是个指向存放int类型数组的指针
int **p 先和第一个结合说明是这个指针,再和第二个*结合,说明指向的内容还是个指针,p是二级指针
int func(int)//函数 int func(int a) 参数和返回值都是int类型
int (p)(int) 先和结合说明是个指针,指针指向了一个函数,p是一个函数指针 p = func;
指针指向的类型 声明语句里去掉指针的名字和最靠近他的*
int *p – int
char *p – char
int **p – int *
int(*p)[3] – int()[3]
指针的类型 声明语句里去掉指针的名字
int *p – int *
char *p – char *
int **p – int **
int(p)[3] – int()[3]
[练习]
-
int a[5]={1,2,3,4,5};
int *p = a;a[i] *(a+i) *(&a[0]+i) //*a++ 数组名是个常量
p[i] *(p+i) *(&p[0]+i) *p++*p++ // 取出a[0]再p++
*(p++) // 取出a[0]再p++ ++是后操作
(*p)++ // a[0]=a[0]+1
*(++p) // 取出a[1]
*++p // 取出a[1] -
char a[10] = “hello”;
char *p = a;printf("%s\n",a/p);
for(i=0;i<10;i++)
putchar(a[i]/p[i]);char a[10] = {‘h’,‘e’,‘l’,‘l’,‘o’};
char *p = “www.hqyj.com” //把字符串的首地址放在p
//“www.hqyj.com” .ro只读
a[0] =‘w’; //正确的
*p =‘t’; //错误的
*a++; //错误的
*p++; //正确的 *p; p++;
(*p)++; //错误的 (*p)=w p[0]=w+1
*(++p);//正确的
a = p; //错误的 给常量赋值X
p = a; //正确的
a = “world”; //错误的
p = “hello”; //正确的 -
int *p ,i ,j;
int a[3][2]={1,2,3,4,5,6};p=a[0];
p=&a[0][0];
// p=a; p+1 - 4 a+1 - 8含义不同不能直接赋值
for(i=0;i<6;i++)
printf("%d\n",*p++);p=&a[0][0];
for(i=0;i<3;i++)
for(j=0;j<2;j++)
printf("%d\n",(p+2i+j)); -
指针数组 char *a[3]
int x=100,y=200;
int *a[2];
a[0]=&x a[1]=&y;
char *a[3]={“hello”,“world”,“haha”}; -
数组指针 char(*p)[3] //行指针
a[i][j] *(a[i]+j) ((a+i)+j)
p[i][j] *(p[i]+j) ((p+i)+j)
【3】 网络基础
- IP地址:主机在网络中的编号
- 192.168.31(网络号) .88(主机号) 点分十进制来表示的(IPv4 - 32byte)
IPv6 - 128byte - 网络划分
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
192.168.31.1 - 通常会被作为路由或者网关
192.168.31.255 - 广播地址
4.子网掩码 netmask 255.255.255.0
255.255.255.0 & 192.168.31.88 = 网络号
-
DNS 域名解析
www.baidu.com ->ip
*免费的域名解析器
114.114.114.114
8.8.8.8 -
Ubuntu网络设置
1)ifconfig
inet addr:192.168.31.166 //Ubuntu IP地址
Bcast:192.168.31.255 //广播地址
Mask:255.255.255.0 //子网掩码
MTU:1500 //一个网络包最多有1500个字节
Link encap:Local Loopback //回环地址
inet addr:127.0.0.1 //发数据给网卡,网卡返回给我的数据
检查网卡是否正常 ping 127.0.0.1
- A.通过命令行
sudo ifconfig eth0 192.168.31.88(ip地址)
route add default gw 192.168.31.1(网关地址)
B. 网络配置文件 - 固定电脑IP,设置为静态
sudo vim /etc/network/interfaces
iface eth0 inet static //interface接口
address 192.168.31.87
netmask 255.255.255.0
gateway 192.168.31.1
broadcast 192.168.31.255
dns-nameservers 8.8.8.8
3)重启网络
sudo service network-manager restart
sudo /etc/init.d/networking restart
[练习]
1.安装文件传输服务器tftp
2.nfs网络文件系统(netwrok file system)
/home/linux/nfs *(rw,sync,no_subtree_check,no_root_squash)
*:所有用户
rw:读写
sync:实现文件的同步
no_subtree_check:不检查子目录的权限
【4】 文件的压缩和打包
- windows的压缩软件:winrar 7zip实际上汇总了打包和压缩两个过程
[1]压缩 - 压缩的对象是文件不是目录
.gz
.bz2
.xz
压缩/解压的命令
gzip/gunzip 文件名
bzip2/bunzip2 文件名
xz/unxz 文件名 - 压缩的原理 算法 换行啊空格之类的删除,只有一行的话怎么压缩也不会变得很小
- 压缩率(占用的大小):gzip < bzip2 < xz
压缩速率(速度时间):gzip > bzip2 > xz - ls -lh 可以显示文件的大小
gzip COPING
gunzip COPING.gz
1.压缩之后源文件不保留,解压压缩包不保留
2.压缩的对象是文件而不是目录
gzip: hello is a directory – ignored
3.xz在100M以上的文件才能体现压缩率
[2]打包
-
打包的对象是目录
-
tar打包和拆包
-c 打包(create)
-x 拆包
-f 文件名 —>一定是最后的位置
-v 显示过程
eg:
tar -cvf 目录名.tar(包名) 目录名(对象)
tar -cvf hello.tar hello //把hello目录打包为hello.tar- 打包之后目录编程文件,所以可以对这个文件压缩
- 对文件归档,变大了
- 打包之后原来的目录存在
tar -xvf 包名
tar -xvf hello.tar //把hello.tar拆包- 拆包之后原来的包存在
[问题] 文件 - 打包 - 压缩 - 解压 - 拆包 - 文件
-z gzip压缩
-j bzip2压缩
-J xz压缩
eg: 打包并压缩成gz的格式
hello -> hello.tar -> hello.tar.gz
tar -czvf hello.tar.gz hello
打包并压缩成gz - 拆包并解压
tar -czvf XX.tar.gz 目录名
tar -xzvf XX.tar.gz
打包并压缩成bz2 - 拆包并解压
tar -cjvf XX.tar.bz2 目录名
tar -xjvf XX.tar.bz2
打包并压缩成xz - 拆包并解压
tar -cJvf XX.tar.xz 目录名
tar -xJvf XX.tar.xz
[练习] 解压拆包hello.tar.xz(有问题)
tar -xJvf hello.tar.xz --不成功
tar -cjvf hello.tar.xz hello --不提示错误,不压缩
万能拆包 : tar -xvf 包名
【5】 文件相关的命令
- 创建 touch
- 删除 rm
- 重名名/移动 mv
- 复制cp
- cat 将文件的内容显示到中端上
cat hello.c
cat -n 文件名 //显示行号 - echo
echo “123”
echo “hello” > 1.c - head 文件名 //默认从头开始显示前十行
head -n行 文件名 //显示前n行 - tail 文件名 //默认显示后十行
tail -n行 文件名 //显示后n行
[练习] 1. 显示passwd文件的第34行
head -34 passwd | tail -1
2. 同时看到行号
cat -n passwd |head -34 | tail -1 - file查看文件格式
file ls
file a.out - wc查看文件大小
wc 文件名 //全部显示
wc -w 文件名 //单词个数
wc -l 文件名 //行数
wc -c 文件名 //字符数 - grep搜索 在文件中搜索字符串
grep “string” 文件名/目录 参数
参数:
-n 显示行号
-R 递归搜索
-i 忽略大小写
-w 按照单词精确搜索
eg:
grep “linux” passwd
grep “main” ./ -Ri //忽略大小写
grep “main” ./ -wRn //精确搜索出main - more 文件名 (回车继续往下显示)
less 文件名 上键向上显示 下键向下显示 q退出 - 查看二进制文件
od -c 二进制文件名(a.out)
od -c a.out //如果全是0肯定不对
[练习] passwd文件 - 搜索linux用户是否存在,如果存在就显示linux的用户信息,linux123 abclinux不显示
grep “^linux” passwd -w
^abc 以abc开头
abc$ 以abc结尾
^abc$ 这一行只有abc
- /etc/passwd
linux❌1000:1000:linux,:/home/linux:/bin/bash
用户名 有密码 用户ID 组ID 登录时候的名字 家目录 命令解析器
只能切换linux和root用户,其他是伪用户,不能切换
- 文件的查找find
find 路径 -name 文件名
find ./ -name student.c //从当前位置向里搜索student.c文件在哪
[*拓展]