linux应用开发1-Linux 应用开发基础篇

Linux 应用开发基础篇

一、应用编程概念

  • 核心内容
    • 理解 Linux 应用开发的编程范式,区分系统调用(如内核层的 read/write)与库函数(如标准 I/O 库对系统调用的封装)。掌握开发全流程:代码编写 → 编译(借助 GCC 工具链)→ 调试(利用 GDB 等工具)→ 优化。明确 Linux 应用在多用户、多任务环境下的设计原则,包括资源管理、权限控制等关键要点。

二、文件 I/O

(一)文件 I/O 基础操作

  • 系统调用接口
    • open:打开或创建文件,返回文件描述符(示例:int fd = open("test.txt", O_RDWR | O_CREAT, 0644);)。
    • read/write:执行文件数据的读取与写入(函数原型:ssize_t read(int fd, void *buf, size_t count);)。
    • close:关闭文件描述符,释放系统资源。
  • 应用示例:实现简单文件复制功能,通过循环读取源文件数据并写入目标文件。

(二)深入探究文件 I/O

  • 文件描述符:内核为打开文件分配的非负整数,是文件访问的唯一标识。
  • I/O 缓冲机制:内核空间的缓冲机制提升读写效率,可通过 O_DIRECT 标志绕过缓冲(适用于大数据量场景)。

三、标准 I/O

(一)标准 I/O 库函数使用

  • 常用函数
    • fopen:打开文件并返回文件流指针(示例:FILE *fp = fopen("file.txt", "r");)。
    • fread/fwrite:基于缓冲的读写操作,适用于文本、二进制文件。
    • fclose:关闭文件流,同时刷新缓冲。
  • 格式化操作:利用 fprintf/fscanf 实现格式化读写。

(二)标准 I/O 缓冲策略

  • 全缓冲:缓冲区满或调用 fflush 时刷新,常见于文件操作。
  • 行缓冲:遇到换行符时刷新,适用于终端输入输出。
  • 无缓冲:直接读写,如 stderr 的输出特性。

四、文件属性和目录

(一)文件属性

  • 权限管理:使用 chmod 函数修改文件权限(示例:chmod("file.txt", 0644);),掌握 r(读)、w(写)、x(执行)权限位的含义。
  • 元数据获取:通过 stat 函数获取文件大小、修改时间等信息(示例:struct stat file_stat; stat("file.txt", &file_stat);)。

(二)目录操作

  • 目录创建与删除mkdir 函数创建目录(示例:mkdir("new_dir", 0755);),rmdir 用于删除空目录。
  • 目录遍历:借助 opendir/readdir 函数读取目录下文件(如遍历目录并打印所有文件名)。

五、字符串处理

(一)字符串操作函数

  • 基础操作strcpy(复制)、strcat(拼接)、strlen(求长度)。
  • 高级操作strstr(查找子串)、sprintf(格式化字符串写入)。
  • 安全函数:使用 strncpy/strncat 避免缓冲区溢出风险。

(二)应用场景

  • 文本解析:在解析配置文件时提取关键字段。
  • 日志处理:拼接日志信息,格式化输出时间、事件内容等。

六、系统信息与系统资源

(一)获取系统信息

  • 内存信息:读取 /proc/meminfo 文件或通过 getrusage 函数获取内存使用情况。
  • CPU 信息:解析 /proc/cpuinfo,获取 CPU 型号、核数等参数。
  • 系统负载:利用 getloadavg 函数获取系统平均负载。

(二)系统资源管理

  • 资源限制:通过 setrlimit 函数限制进程对 CPU、内存等资源的使用(如限制进程最大文件打开数)。
  • 进程资源分配:理解进程在内存、CPU 时间上的分配策略,优化资源利用率。

七、信号

(一)信号概念

  • 信号类型:包括中断信号(SIGINT)、终止信号(SIGTERM)、异常信号(SIGSEGV 段错误)等。
  • 信号传递:内核向进程发送信号,通知进程发生特定事件。

(二)信号处理

  • 默认处理:系统对信号的默认行为(如终止进程)。
  • 自定义处理:通过 signalsigaction 函数设置信号处理函数(如捕获 SIGINT 信号,实现程序优雅退出)。

八、进程

(一)进程创建与终止

  • fork 函数:创建子进程,父子进程共享代码段,数据段独立(示例:pid_t pid = fork(); if (pid == 0) { /* 子进程逻辑 */ })。
  • 进程终止exit 函数终止进程,_exit 直接通过系统调用终止,不刷新缓冲。

(二)进程控制

  • 进程等待:使用 wait/waitpid 函数等待子进程结束,获取其退出状态。
  • 优先级调整:通过 nice 函数调整进程优先级,影响 CPU 调度策略。

九、进程间通信

(一)通信方式

  • 管道:匿名管道(pipe 函数,用于父子进程通信)和命名管道(mkfifo,支持跨进程通信)。
  • 消息队列:通过 msgget/msgsnd/msgrcv 实现消息的发送与接收。
  • 共享内存:利用 shmget/shmat 映射共享内存区域,常配合信号量实现同步。
  • 套接字:支持网络间进程通信,适用于 C/S 架构。

(二)适用场景

  • 管道适合简单数据传递,共享内存适合大数据量高效传输,套接字用于网络分布式系统。

十、线程

(一)线程创建与管理

  • 线程库函数:借助 POSIX 线程库,使用 pthread_create 函数创建线程(示例:pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL);)。
  • 线程终止pthread_exit 终止线程,pthread_join 等待线程结束。

(二)线程与进程差异

  • 资源占用:线程共享进程内存空间,创建/销毁开销小;进程拥有独立资源,开销较大。
  • 调度:线程属于进程内调度,进程是系统级调度单位。

十一、线程同步

(一)同步机制

  • 互斥锁:通过 pthread_mutex_lock/unlock 保护临界区,防止竞态条件(如多个线程安全访问共享变量)。
  • 读写锁:利用 pthread_rwlock_rdlock/wrlock 支持多读单写,提升并发读效率。
  • 信号量:通过 sem_init/sem_wait/sem_post 实现线程间计数同步。

(二)解决线程问题

  • 避免死锁:采用按顺序加锁、限时等待锁等策略。
  • 数据一致性:合理使用同步机制保护共享数据。

十二、高级 I/O

(一)异步 I/O 与非阻塞 I/O

  • 异步 I/O:使用 aio_read/aio_write 函数,操作完成后通过回调或信号通知。
  • 非阻塞 I/O:设置文件描述符为非阻塞(示例:fcntl(fd, F_SETFL, O_NONBLOCK);),避免阻塞等待。

(二)应用实践

  • 在网络服务器中,非阻塞 I/O 配合多路复用(select/poll/epoll)实现高并发连接处理。
  • 异步 I/O 适用于大数据文件读写,提升系统响应性能。

🌟 互动支持 🌟

🔔 博客互动指南:

  • 点赞 👍:觉得内容有用?点击底部点赞按钮,你的认可就是创作动力!
  • 收藏 ⭐️:点击收藏夹,随时回顾技术干货(建议搭配笔记食用更佳~)
  • 关注 🔔:点击博主头像旁「+关注」,第一时间获取最新技术分享!
  • 评论 💬:有疑问或建议?欢迎在评论区留言,博主会及时回复交流!

💻 祝福大家:

「愿你的代码没有bug,发际线永远坚挺!」
—— 致敬每一位在0和1的世界里创造奇迹的开发者!

🌈 关于博主:

专注「控制理论」[linux系统]「嵌入式系统」「AI」领域,定期分享技术干货与项目实战。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值