LinuxC高级_day2

18 篇文章 0 订阅

LinuxC高级_day2

  1. main.c文件书写
    #include <stdio.h> --系统给的
    也可以用"stdio.h"
    #include "../student.h" – 自定义

  2. 指针的类型 和 指针指向的类型
    sizeof(*cls)-Y sizeof(cls)-X sizeof(class_t)-Y

  3. 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]

[练习]

  1. 指针和整型数组
   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]
  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
  1. 一级指针和二维数组
   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
  1. 指针数组
    变量类型 *变量名[个数] 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]网络

  1. IP网络中主机的唯一标识(MAC)
    winodws: win+r ->cmd -> ipconfig -> 192.168.31.91
    ubuntu: ifconifg

  2. 组成: 网络号(192.168.31 - 主机所在网段) 主机号(91 - 网络中主机的编号) 点分十进制表示

  3. IPv4(32byte 2^32=4G 42亿) --> IPv6(128byte 淘宝 京东)
    耗尽为什么还能分配? - 价格 总有空闲

  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. 192.168.31.1 – 路由器route地址(网关)
    192.168.31.255 – 广播地址

  6. 子网掩码 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

  7. 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
  1. lo: loopback 回环地址 网卡回复的地址inet addr:127.0.0.1
    MTU:1500 一个网络包最有有1500字节

[3]tftp 和 nfs配置

  1. tftp
    1. 注意文件夹的名字正确
      2)修改配置文件之后一定要重启服务
      3)put的时候当前文件夹下要有该文件
  2. 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:不检查子目录权限

[4]文件的压缩和打包
0. windows压缩 : 好压 7zip rar 集合了压缩和打包两个过程

  1. 压缩的对象是文件
    压缩文件后缀:
    .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以上的文件压缩的时候才体现压缩率

  1. 打包的对象是目录
   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] 文件操作命令

  1. 创建touch
  2. 删除rm
  3. 重命名 移动mv
  4. 复制cp
  5. 查看文件cat
cat /etc/issue ubuntu版本号
cat -n 文件名 : 显示行号
  1. echo :
 echo "hello world"
 echo 123
 echo "hahaha" > test.txt //新建
 echo "hahaha" >> test.txt //追加
  1. head 文件名
   head hello.c //默认显示前10行
   head -n行 hello.c //显示前n行
  1. tail 文件名
   tail hello.c //默认显示后10行
   tail -n行 hello.c //显示后n行

[练习] 1. 显示passwd文件的第34行

   head -34 passwd | tail -1 
  1. 顺便显示行号
cat -n passwd |head -34 | tail -1
  1. file查看文件格式
    file a.out
    file ls
  2. wc
    wc -w文件名 //单词个数
    wc -c //字符个数
    wc -l //行数
  3. grep 筛选 搜索
    grep "字符串" 文件名 参数
    -n显示行号
    -R递归搜索
    -i忽略大小写
    -w按照单词精确查找
    grep "main" * -nR //搜索所有文件及子目录并显示行号
  4. vim

/main 按键盘回车 : 高亮显示
/^abc 高亮显示以abc开头的行
/abc$ 高亮显示以abc结尾的行

[练习] 1. 筛选出linux用户的信息 abclinux linux123都不显示

grep "^linux" passwd -wn
37:linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
  1. 文件的查找
    find 路径 -name 文件名
    find ./ -name 3.c 从当前目录向子目录查找叫3.c的文件
  1. 文件的裁剪
    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

  1. 软链接的文件类型是l
  2. 修改源文件或者链接文件 对方跟着改变内容
  3. 删除链接文件 源文件存在 并且可以修改
  4. 删除源文件 链接会断开
  5. 将源文件重新建立回来,链接会重新建立

硬链接(起别名) 根据linux系统分配的inode号建的 没办法跨越文件系统
ln 被链接的文件(源文件) 生成的链接文件(目标文件)
ln ~/Desktop/DC21071/day1/test.c hardlink.txt

  1. 硬链接的文件类型是- 普通文件
  2. 源文件删除 链接依然可用 文件存在

[7]磁盘相关的命令

  1. 磁盘分区情况
  sudo fdisk -l
  /dev/sdaX : 系统分区盘
  /dev/sdbX : U盘
  1. 分区的使用率
  sudo df -h
  1. 挂载
   sudo mount /dev/sdbX 目录
   sudo umount 取消挂载

[8]进程相关的命令

  • 守护进程
    1. 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 退出
    2. kill 发送信号
      kill -9 PID : 杀死进程
      kill -l :查看所有的信号
      kill PID : 默认发送的信号是15
    3. nice 以指定的优先级运行程序
      renice 修改进程的优先级
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值