LinuxC高级_day2
-
main.c文件书写
#include <stdio.h>
--系统给的
也可以用"stdio.h"
#include "../student.h"
– 自定义 -
指针的类型 和 指针指向的类型
sizeof(*cls)-Y sizeof(cls)-X sizeof(class_t)-Y
-
1)先++再判满
2)初始人数-1 表示班级是空
3)班级满的时候加上的人数要减回来
4)getchar()
吃掉字符
while(getchar() != '\n');
清空缓存区垃圾字符
5)scanf
返回值 正确输入的个数
6)malloc
空间释放
if(cls != NULL)
{
free(cls);
cls = NULL;
}
[1]指针
变量类型 * 变量名 //*只是一个标志 没有功能
32位机器里 一个指针变量占多大?
char *p;
sizeof(p)
= 4字节
sizeof(*p)
= 1字节
从定义分析
int p
整型变量
int *p
先和*
结合说明是个指针 再和int结合 说明指针指向的内容是int类型 p是一个指向int类型的指针
int p[3]
先和[]结合说明是个数组 再和int结合 说明数组里的元素是int类型 p是一个整型数据组成的数组
int *p[3]
先和[]
结合([]
优先级比*
高)说明是个数组 再和*
结合说明数组里保存的元素是指针 最后和int
结合说明指针指向int p
是一个指向整型数据指针的数组
int(*p)[3]
先和*
结合(因为()
优先级最高)说明是个指针 再和[]结合说明指针指向了一个数组 再和int结合说明数组的元素都是int类型
p
是一个指向了由整形数据组成的数组的指针
int **p
先和第一个*
结合 说明是个指针 再和第二个*
结合 说明指针指向了一个指针(地址)p
是二级指针
int p(int)
函数int func(int a)
参数是int
返回值是int
int (*p)(int)
先和*
结合说明是个指针 再和外面结合说明指针指向了一个函数 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]
[练习]
- 指针和整型数组
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++) // 取出a[0]再++
(*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.baidu.com";
//字符串首地址 赋值给p www.baidu.com字符串常量 放在.ro
a[0] = 'w' Y
*p = 't' X
*a++ X
*p++ Y
(*p)++ X (*p)=w p[0]=w+1
*(++p) Y
a = p X
p = a Y
a="haha" X
p="lalala" Y
- 一级指针和二维数组
int *p,i,j;
int a[3][2] = {1,2,3,4,5,6};
p=a[0];
p=&a[0][0];
for(i=0;i<3;i++)
{
for(j=0;i<2;j++); //i行j列
printf("%d\n",); *(*(p+i)+j) //*(p+i*2+j)
}
// p=a;
for(i=0;i<6;i++)
printf("%d\n",*p++);
a+1移动8个 p+1移动4个
- 指针数组
变量类型 *变量名[个数] char *a[3]
int x=100 int y=200
int *a[2]
a[0]=&x
a[1]=&y
char *a[3]={"hello","haha","lala"};
5.数组指针
变量类型(*变量名)[个数]
char(*p)[3] //p是一个指针 指向了行地址
a[i][j] == *(a[i]+j) == *(*(a+i)+j)
p[i][j] == *(p[i]+j) == *(*(p+i)+j)
[2]网络
-
IP网络中主机的唯一标识(MAC)
winodws: win+r ->cmd -> ipconfig -> 192.168.31.91
ubuntu: ifconifg -
组成: 网络号(192.168.31 - 主机所在网段) 主机号(91 - 网络中主机的编号) 点分十进制表示
-
IPv4(32byte 2^32=4G 42亿) --> 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 – 路由器route地址(网关)
192.168.31.255 – 广播地址 -
子网掩码 netmask 255.255.255.0 & 192.168.31.91
= 192.168.31.0获取网络号
DNS 域名解析
ping www.baidu.com --> ip免费的域名解析器:
114.114.114.114
8.8.8.8 -
Ubuntu 手动改一个配置文件
sudo vim /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.6.138
netmask 255.255.255.0
gateway 192.168.6.1
broadcast 192.168.6.255
dns-nameservers 8.8.8.8
sudo service network-manager restart
- lo: loopback 回环地址 网卡回复的地址inet addr:127.0.0.1
MTU:1500 一个网络包最有有1500字节
[3]tftp 和 nfs配置
- tftp
- 注意文件夹的名字正确
2)修改配置文件之后一定要重启服务
3)put的时候当前文件夹下要有该文件
- 注意文件夹的名字正确
- nfs
1)挂载时候的ip是自己的Ubuntu ip地址用ifconfig查看
2)挂载的时候要带两个目录 表示将目录1挂载到目录2
3) 挂载之后你在1里面创建文件 2里面也就存在了 相当于两个是同一个目录
*(rw,sync,no_subtree_check,no_root_squash)- : 所有用户 sync:实现文件同步
rw : 可读可写 no_subtree_check:不检查子目录权限
- : 所有用户 sync:实现文件同步
[4]文件的压缩和打包
0. windows压缩 : 好压 7zip rar 集合了压缩和打包两个过程
- 压缩的对象是文件
压缩文件后缀:
.gz
.bz2
.xz
压缩和解压的命令
gzip/gunzip 文件名
bzip2/bunzip2 文件名
xz/unxz 文件名
eg:
ls -lh 可以看文件的大小
gzip COPING -- 压缩
gunzip COPING.gz -- 解压
- 压缩率: 占用的大小 gzip < bzip2 < xz
压缩速率: 时间长短 gzip > bzip2 > xz
注意: 1)压缩之后 只保留压缩包 源文件不存在
解压之后压缩包不存在
2)压缩目录的时候会提示错误 ignore(忽略)
3)xz对100M以上的文件压缩的时候才体现压缩率
- 打包的对象是目录
tar
-c 打包(create)
-x 拆包
-f 文件名 //一定放在最后的位置
-v 显示过程
eg: 对hello目录打包:
tar -cvf hello.tar hello
拆包:
tar -xvf hello.tar
注意:1) 打包(归档)之后变大了
2) 打包保留源文件目录 拆包之后保留包
3)打包之后 d --> - 成为普通文件
文件 – 打包 – 压缩 – 解压 – 拆包 – 文件
以什么方式压缩就要以什么方式解压
-z gzip压缩
-j bzip2压缩
-J xz压缩
eg: 打包并压缩成gz格式
tar -czvf hello.tar.gz
tar -xzvf hello.tar.gz 拆包并解压
打包并压缩成bz2格式
tar -cjvf hello.tar.bz2
tar -xjvf hello.tar.bz2 拆包并解压
打包并压缩成xz格式
tar -cJvf hello.tar.xz
tar -xJvf hello.tar.xz 拆包并解压
万能拆包
tar -xvf hello.tar.oooo
[5] 文件操作命令
- 创建
touch
- 删除
rm
- 重命名 移动
mv
- 复制
cp
- 查看文件
cat
cat /etc/issue ubuntu版本号
cat -n 文件名 : 显示行号
- echo :
echo "hello world"
echo 123
echo "hahaha" > test.txt //新建
echo "hahaha" >> test.txt //追加
- head 文件名
head hello.c //默认显示前10行
head -n行 hello.c //显示前n行
- tail 文件名
tail hello.c //默认显示后10行
tail -n行 hello.c //显示后n行
[练习] 1. 显示passwd文件的第34行
head -34 passwd | tail -1
- 顺便显示行号
cat -n passwd |head -34 | tail -1
- file查看文件格式
file a.out
file ls - wc
wc -w
文件名 //单词个数
wc -c
//字符个数
wc -l
//行数 - grep 筛选 搜索
grep "字符串" 文件名 参数
-n
显示行号
-R
递归搜索
-i
忽略大小写
-w
按照单词精确查找
grep "main" * -nR
//搜索所有文件及子目录并显示行号 - vim
/main 按键盘回车 : 高亮显示
/^abc 高亮显示以abc开头的行
/abc$ 高亮显示以abc结尾的行
[练习] 1. 筛选出linux用户的信息 abclinux linux123都不显示
grep "^linux" passwd -wn
37:linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
- 文件的查找
find 路径 -name 文件名
find ./ -name 3.c 从当前目录向子目录查找叫3.c的文件
- 文件的裁剪
cut -d "分隔符" -f 域 文件名
cut -d ":" -f 1,3-5 address.txt
[练习] linux用户的用户名和家目录截取出来 并显示行号
grep "^linux" passwd -nw | cut -d ":" -f 1,2,7
15.文件属性
ls -l
-rw-rw-r-- 1 linux linux 69 Jul 28 01:33 address.txt
-: 文件属性
7种 bsp-lcd
- 普通文件
b 块设备文件 : 硬盘 /dev/sda
s 套接字文件 : 网络传输信息用
p 管道文件(pipe): 进程间的通信(mkfifo)
l 软连接文件 : 类似于快捷方式
c 字符设备文件: 鼠标 键盘 /dev/input/mouseX
d 目录
rw-rw-r–: 权限
rw- 用户的权限
rw- 组的权限
r-- 其他用户的权限
r:可读 w:可写 x:可执行 -:无权限
4 2 1 0
u: 用户
g: 组
o: 其他
a: ugo全部
+:给权限
-: 去权限
[练习] 给一个文件用户加可执行权限 不改变其他权限
sudo chmod u+x 文件名
sudo chmod u-x 文件名
sudo chmod a+w 文件名:给所有用户加可写的权限
1: --> 文件 硬链接的个数
–> 文件夹 子目录的个数
linux linux: 用户名 组名
69: 大小
Jul 28 01:33 :创建时间
address.txt:文件名
[6]链接 ln
软连接 ln -s(快捷方式)
符号链接,利用文件路径来创建的,最好选用绝对路径
ln -s 被链接的文件(源文件) 生成的链接文件(目标文件)
ln -s ~/Desktop/DC21071/day1/test.c softlink.txt
- 软链接的文件类型是l
- 修改源文件或者链接文件 对方跟着改变内容
- 删除链接文件 源文件存在 并且可以修改
- 删除源文件 链接会断开
- 将源文件重新建立回来,链接会重新建立
硬链接(起别名) 根据linux系统分配的inode号建的 没办法跨越文件系统
ln 被链接的文件(源文件) 生成的链接文件(目标文件)
ln ~/Desktop/DC21071/day1/test.c hardlink.txt
- 硬链接的文件类型是- 普通文件
- 源文件删除 链接依然可用 文件存在
[7]磁盘相关的命令
- 磁盘分区情况
sudo fdisk -l
/dev/sdaX : 系统分区盘
/dev/sdbX : U盘
- 分区的使用率
sudo df -h
- 挂载
sudo mount /dev/sdbX 目录
sudo umount 取消挂载
[8]进程相关的命令
- 守护进程
- ps
ps aux
:查看系统的进程
ps -ef
: 可以显示父进程号
PID: 进程号 STAT:状态 PPID:父进程号
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.
X dead (should never be seen)
Z defunct (“zombie”) process, terminated but not reaped by its
parent.
< high-priority (not nice to other users)
N low-priority (nice to other users)- is in the foreground process group
top
实时查看进程
shift + >
向下翻页
shift + <
向上翻页
q
退出
- is in the foreground process group
- kill 发送信号
kill -9 PID
: 杀死进程
kill -l
:查看所有的信号
kill PID
: 默认发送的信号是15 nice
以指定的优先级运行程序
renice
修改进程的优先级
- ps