Unix C编程笔记:内存、文件、信号与进程通信

需积分: 10 2 下载量 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程序。同时,理解这些概念对于调试和优化代码也至关重要。记得在实践中不断练习,加深理解。