Linux基础知识---学习笔记加深

Linux

头文件守卫,防止头文件重复包含。
#ifnedf HEAD_H
#define HEAD_H

#endif

压缩,解压

1安装 sudo apt-get install 软件名字
2卸载 sudo apt-get remove 软件名
3安装包 .deb
要生成的压缩包名------>test.tar.gz

  • tar方式

    • 压缩
      tar zcvf 要生成的压缩包名 压缩材料 gzip方式压缩
    • 压缩
      tar jcvf 要生成的压缩包名 压缩材料 bzip方式压
  • rar方式

    • 压缩
      rar a -r 要生成的压缩包名 压缩材料
    • 解压
      unrar x 压缩包
  • zip方式

  • 压缩
    zip -r 压缩包名 压缩材料
    列如 zip -r testzip.zip dir hello.c

  • 解压
    unzip 压缩包名
    列如 zip testzip.zip

静态库制作及步骤

**1.**将.c生成.o文件

gcc -c add.c -o add.

**2.**使用ar工具制作静态库

ar rcs lib库名.a add.o sub.o dir.o

**3.**编译静态库到可执行文件中

gcc test.c lib库名.a  -o a.out

动态库制作及使用

**1.**将.c生成.o文件(生成与位置无关的代码,-fPIC)

 gcc -c add.c -o add.o  -fPIC

**2.**使用使用gcc -shared 制作动态库

 gcc -shared lib库名.so add.o sub.o dir.o

**3.**编译可执程序时,指定所使用的动态库。-l指定库名(去掉前缀lib和.so后缀) -L 指定库路径

gcc test.c -o a.out -l mymath -L ./lib

4运行可以执行程序,但是./a.out出错

  1. 原因
  • 链接器 工作于链接阶段。 工作需要 -l -L

  • 动态链接器。工作与程序运行阶段。工作时需要提供动态链接库所在外置。

解决方法

【1】通过环境变量:export LD_LIBRARY_PATH= 动态库路径。

  • ./a.out成功 (临时文件。重启终端环境变量失效。)

【2】永久生效写入终端配置文件,.bashrc 建议使用绝对路径。

  • vi ~/.bashrc

    * 写入export LD_LIBRARY_PATH=动态路径。保存。
    
  • …bashrc/ source .bashrc/ 重启终端—>让修改后的.bashrc生效。

  • ./a.out 成功

【3】拷贝自定义动态库到/lib目录(标准c库所在目录文件)

【4】配置文件法

  • sudo vi /etc/ld.so conf
  • 写入动态库绝对路径 保存
  • sudo ldconfig -v 使用配置文件生效
  • ./a.out 成功 使用 ldd a.out查看

Makefile管理项目

1个规则

  • 目标:依赖条件(一个tab缩进)

    • 1.目标的时候必须晚于依赖条件的时间,否则,更新目录
    • 2.依赖条件如果不存在,寻找新的规则去产生依赖条件
  • ALL: 指定Makefile的终极目录

2个函数

  • src=$(wildcard ./*.c):匹配当前工作目录下的所有.c文件,将文件名组成列表,赋值给变量src。 src=add.c sub.c div.c
  • obj=$(patsubst %.c %.o $(src)):将参数3中,包含参数1的部分,替换为参数2,obj=add.0 sub .0 div.o
  • clean:(没有依赖)
    • -rm -rf $(obj) a.out “-”,作用是,删除不存在的文件时,不报错,顺序执行结束

3个自动变量

      *   $@:代表目录, 在规则的命令中,表示规则的目录
  • $^:在规则命令中,表示所有依赖条件

  • $<:在规则的命令中,表示第一个依赖条件,如果将变量应用在模式规则中,它可依赖条件列表中的依赖次取出,套用模式规则

  • 模式规则

    %.o:%.c

    ​ gcc -c $< -o $@

  • 静态模式规则

​ $(obj):%.o:%.c

​ gcc -c $< -o $@

  • 伪目标

    .PHONY :clear ALL

open 函数

1 int open(char pathname,int flags)*

  • 参数
    • pathname:欲打开的文件路径
    • flags;文件打开方式:#include<fcntl.h>
      • O_RDONLY|O_WRONLY
  • 返回值
    • 成功 :打开文件所的到对应的文件描述符(整数)
    • 失败:-1 设置error
  • int open(char *pathname,int flags,mode_t mode)
  • 参数
    • pathname 欲打开的文件路径flags;
    • flags;文件打开方式O_RDONLY|O_WRONLY#include<fcntl.h>
    • mode:参数3使用的前提,参数2指定了O_CREAT, 文件权限
  • 返回值
    • 成功:打开文件所得到对应的文件描述符,
    • 失败:-1设置error

read函数

  • ssize_t(int fd,void *buf,size_t count);

  • 参数:

    • fd:文件描述符
    • buf:存数据的缓存区
    • count:缓存区大小
  • 返回值

    • 0:文件末尾。
    • 成功:>0读到的字节数
    • 失败:-1,设置error
    • -1:并且error=EAGIN或者EWOULDBLOCK,说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据,

文件描述符

PCB 进程控制块 本质 结构体

  • 成员 :文件描述符表
  • 文件描述符,1/2/3/4…/1023 表中可用的最小的
  • 0----STDIN_FILENO
  • 1----STDOUT_FILENO
  • 2----STDERR_FILEND

阻塞,非阻塞

是设备文件,网络文件的属性

  • 产生阻塞的场景,读设备文件,网络文件(读常规文件无阻塞概念)
  • /dev/tty----终端文件
  • open("/dev/tty",O_RDWR|O_NONBLOCK)--------设置 /dev/tty 非阻塞状态(默认为阻塞状态)

fcntl

  • int flgs=fcntl(fd,f_GETFL);
  • 获取文件状态:F_GETFL
  • 设置文件状态:F_SETFL

stat 函数

在这里插入图片描述

inode节点与目录项

  • ls -i filename 可以查看文件对应的inode编号

  • vi +n filename 打开文件,直接显示 第n行

  • struct stat *buf 传出参数,定义 struct stat sb; &sb

  • stat函数参数

    • int stat(const char *pathname, struct stat *buf);
    • 参数:
      • pathname:文件路径
      • buf:存放文件属性
  • 返回值

    • 成功返回0,
    • 失败返回-1
  • 获取文件大小:buf.st_size;

  • 获取文件类型:buf.st_mode

  • 获取文件权限:buf.st_mode

  • 符号穿透:stat会,lstat不会

link创建硬链接

  • int link(const char *oldpath, const char *newpath);
    • oldpath 原文件
    • newpath 硬链接文件
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘客-追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值