Linux服务器开发项目学习-1.Linux系统编程入门

删除文件目录

  • rm -r <目录路径>
  • rmdir <空白目录>

gcc命令

  • 只编译不链接
    gcc -c <源文件.c>
  • 链接为.out
    gcc <源文件.c> -o <可执行文件名>

静态库的制作

预处理

  • .h .c .cpp
    编译
  • gcc -c <源文件.c>
  • ar rcs <静态库文件名/libxxx.a><目标文件2> ...
    链接
    指定头文件路径、库文件和库路径
    gcc -I<头文件路径> -L<库路径> -l<库名>

动态库的制作

预处理
.h .c .cpp
编译
-fpic 生成与位置无关的代码

  • gcc -c -fpic source.c -o object.o
  • gcc -shared -o libexample.so source1.o source2.o
    链接
    配置环境变量
    用户级别
  • export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
  • ~/ .bashrc添加后刷新source .bashrc
    系统级别
  • sudo vim /etc/profile中添加环境变量,保存后source /etc/profile

静态库和动态库的对比

静态库:

  • 优点:
    打包到应用程序中加载速度快
    发布程序无需提供静态库,移植方便
  • 缺点
    消耗系统资源、浪费内存
    更新、部署、发布不方便

动态库:

  • 优点:
    可以实现进程间资源共享
    更新、部署、发布方便
    可以控制何时加载动态库
  • 缺点:
    加载速度慢
    发布程序时提供依赖的动态库

Makefile

规则

  • 一个文件中可以有一个或多个规则
    目标 …: 依赖 …
    命令(shell命令)

    如果依赖比目标的文件时间晚,需要重新生成文件

  • 其他规则一般为第一条规则服务

  • 定义变量:
    src=$(wildcard ./*.c):使用wildcard函数获取当前目录下的所有.c文件,并将结果赋值给src变量。
    objs=$(patsubst %.c, %.o, $(src)):使用patsubst函数将src中的.c文件替换为对应的.o文件,并将结果赋值给objs变量。
    target=app:定义目标文件的名称为app。

  • 目标和依赖规则:
    $(target):$(objs):定义了$(target)作为目标文件,依赖于$(objs)中的所有文件。
    $(CC) $(objs) -o $(target):使用变量$(CC)表示编译器,将$(objs)中的所有文件链接为一个可执行文件,输出为$(target)

  • 模式规则:
    %.o:%.c:定义了一条模式规则,用于生成.o文件。它表示任意.o文件依赖于同名的.c文件。
    $(CC) -c $< -o $@:使用变量$(CC)表示编译器,通过-c选项将.c文件编译为.o文件。

  • .PHONY规则:
    .PHONY:clean:声明clean为伪目标,即不是真正的文件。
    clean: rm $(objs) -f:定义了一个名为clean的规则,用于删除所有的.o文件。

GDB

  • 通常关掉优化选项 -o 使用 -g -Wall
  • 启动和退出
    gdb 可执行文件
    quit
  • 设置参数/获取参数
    set args 10 20
    show args
  • 查看代码
    list/l 文件名:行号/函数名

断点操作

  • 设置断点
    break/b 行号/函数名//文件名:行号/函数名
  • 查看断点
    info/i break
  • 删除断点
    d/del/delete 断点编号
  • 设置断点生效/无效
    enable/ena disable/dis
  • 设置条件断点
    break 10 if i==5

调试命令

  • 运行GDB程序
    start(第一行)/run(到断点)
  • 继续
    continue/c
  • 向下执行一行代码(不会进入函数体)
    next/t
  • 变量操作
    print/p 打印变量名
    ptype 打印变量类型
  • 向下单步调试
    step/s finish(跳出)
  • 自动变量
    display num 自动打印指定变量的值
    info/i display
    undisplay
  • 其他操作
    set var 变量名=变量值
    until(跳出循环)

文件管理

open

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//打开一个已经存在的文件
int open(const char *pathname, int flags);
//创建一个新的文件
int open(const char *pathname, int flags, mode_t mode);
参数:
        - pathname:文件路径
        - flags:对文件的操作权限设置和其他设置
                O_RDONLY, O_WRONLY, or O_RDWR
                O_CREAT 文件不存在,创建新文件
                为int类型数据,占4个字节,32位,每一位就是一个标志位
        - mode:八进制的数,表示创建出的新文件的操作权限,比如:0777
                 mode & ~umask(0002)
                 0777 -> 111111111
              &  0775 -> 111111101
             ----------------------
                         111111101
                umask作用为抹去某些权限              
    返回值:返回一个新的文件描述符,如调用失败则返回-1;
   
errno:属于Linux系统函数库中的一个全局变量,记录的是最近的错误号
#include <stdio.h>
void perror(const char *s);
     参数s:用户描述,比如hello,最终输出的内容为: hello:xxx(实际错误描述)
 

read

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
        参数:
            - fd: 文件描述符,由open得到
            - buf:需要读取数据存放的地方,数组的地址
            - count:指定数组的大小
        返回值:
            - 成功:
              >0:返回实际读取到的字节数
              =0:文件读取完毕
            - 失败:-1 ,并设置errno
    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t count);
         参数:
            - fd: 文件描述符,由open得到
            - buf:需要往磁盘写入的数据
            - count:写入数据实际大小
         返回值:
            - 成功:实际写入的字节数
            - 失败:-1 ,并设置errno

lseek


#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
    参数:
         - fd:文件描述符
         - offset:
         - whence:
            SEEK_SET
              设置文件指针偏移量
            SEEK_CUR
              设置偏移量:当前位置+第二个参数offset的值
            SEEK_END
              设置偏移量:文件大小+第二个参数offset的值
    返回值:返回文件指针的位置
    作用:
       1.移动文件指针到文件头
         lseek(fd,0,SEEK_SET);
       2.获取当前文件指针的位置
         lseek(fd,0,SEEK_CUR);
       3.获取文件长度
         lseek(fd,0,SEEK_END);
       4.拓展文件的长度
         lseek(fd,100,SEEK_END);
         PS:需要写一次数据才能生效
         

stat

/*
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>
       int stat(const char *pathname, struct stat *statbuf);
              作用:获取文件相关的信息
              参数:
                  - pathname:操作文件的路径
                  - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
              返回值:
                 成功:返回0
                 失败:返回-1 设置errno
       int fstat(int fd, struct stat *statbuf);
               
       int lstat(const char *pathname, struct stat *statbuf);
              作用:获取文件相关的信息
              参数:
                  - pathname:操作文件的路径
                  - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
              返回值:
                 成功:返回0
                 失败:返回-1 设置errno
       #include <fcntl.h>        
       #include <sys/stat.h>
       int fstatat(int dirfd, const char *pathname, struct stat *statbuf,
                   int flags);
   
    */
   #include<sys/stat.h>
   #include<unistd.h>
   #include<stdio.h>
   int main(){
   struct stat statbuf;
   int ret =stat("a.txt",&statbuf);
   if(ret==-1){
    perror("stat");
    return -1;
   }
   printf("size: %ld\n",statbuf.st_size);
   return 0;
   }

文件属性

  • int access(const char* pathname, int mode);
    作用:判断某个文件是否有某个权限,或者是否存在;
    返回值:成功为0,失败为-1;
  • int chmod(const char* filename,int mode);
    作用:修改文件的权限
    返回值:成功为0,失败为-1;
  • int chown(const char* path,uid_t owner,gid_t group);
    作用:设置文件所有者和文件关联组
  • int truncate(const char* path,off_t length);
    作用:缩减或拓展文件的尺寸到制定大小;
    返回值:成功为0,失败为-1;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值