Unix C编程笔记:内存、文件、信号与进程通信
需积分: 10 116 浏览量
更新于2024-07-26
1
收藏 46KB DOCX 举报
"UnixC课堂笔记"
在学习Unix C编程时,了解系统调用、内存管理、文件操作、进程和线程通信是至关重要的。以下是对这些主题的详细说明:
1. 静态库与共享库的区别
静态库在编译时会被链接到可执行程序中,成为程序的一部分,因此生成的程序体积较大,但运行时不需要依赖额外的库文件。
共享库则在程序运行时动态加载到内存中,多个程序可以共享同一份库文件,节省内存资源。但运行时需要确保库文件可访问,否则程序可能无法正常运行。
2. 函数参数与返回值
函数参数通常用于传递输入数据,而返回值则表示函数执行的结果,例如错误状态或计算结果。例如,`intmax()` 函数通过指针参数 `*r` 返回两个整数中的较大值,并通过返回值 `-1` 表示两者相等的异常情况。
3. 随机数生成
在Unix C中,可以使用 `<time.h>` 和 `<stdlib.h>` 头文件来生成随机数。`srand(time(0))` 初始化随机数生成器,`rand()` 生成伪随机数,`rand() % 100` 可以限制结果在0到99之间,以获取100以内的随机数。
4. 错误处理
当文件打开失败时,可以使用 `errno` 获取系统错误号,`strerror(errno)` 转换为错误信息字符串。`perror("")` 会打印出带有错误信息的前缀,`printf(“…%m\n”)` 是另一种打印错误信息的方法。
5. 进程与程序的关系
程序是磁盘上的静态文件,而进程是程序在内存中的动态实例。每个进程都有自己的独立地址空间,包括:
- 代码区:存放可执行代码,只读。
- 全局区:存储全局变量和静态变量,程序执行前分配。
- BSS段:未初始化的全局变量和静态变量在此分配空间,程序启动时自动清零。
- 栈区:函数调用时创建,存放局部变量和函数参数,自动分配和释放。
- 堆区:由 `malloc`、`calloc`、`realloc` 和 `new` 分配的内存位于此处,程序员负责释放。
6. 内存操作的注意事项
- 字符串常量如 `"abcdef"` 存储在只读的代码区,不能直接修改,尝试修改会导致未定义行为。
- 字符数组如 `str2[]` 存储在栈区,可以直接修改,因为栈区允许读写。
7. 进程间通信 (IPC)
Unix提供了多种进程间通信机制,如管道(pipe)、消息队列、共享内存、套接字(socket)等,用于不同进程间的协调和数据交换。
8. 线程同步
线程是进程内的执行单元,线程同步方法包括互斥锁(mutex)、信号量(semaphore)、条件变量(condition variable)等,用于避免竞态条件和死锁问题。
通过这些基础知识的学习,你可以编写更高效、稳定且跨平台的Unix C程序。同时,理解这些概念对于调试和优化代码也至关重要。记得在实践中不断练习,加深理解。
2016-10-31 上传
2013-12-09 上传
2020-05-15 上传
2014-06-24 上传
2020-04-01 上传
2017-11-01 上传
2019-01-02 上传
2011-05-28 上传
2013-04-16 上传
u010152187
- 粉丝: 0
- 资源: 1
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍