系统编程完结整理
Shell(命令与脚本语法)
系统编程(一)shell的学习-CSDN博客
功能/概念 | 语法/关键字 | 参数/用法说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
定义函数 | func_name() { commands; } | 无参数或通过 $1 $2 ... 传参 | 函数执行 | 参数传递、全局变量 | return 只能返回整数状态 | 定义函数打印参数,调用测试 |
调用函数 | func_name arg1 arg2 | 传递参数 | $? 获取返回值 | 参数数量、顺序 | 函数内部修改全局变量 | 调用函数后打印 $? |
变量定义 | var=value | 字符串或数字 | 保存变量 | 空格、引号处理 | $var 获取变量值 | 定义变量并打印 |
条件判断 | if [ condition ]; then ... fi | [ ] 内支持 -f/-d/-z/-n 等 | 条件为真执行 then | [] 和 [[ ]] 区别 | 空格必须严格 | 判断文件是否存在 |
循环 for | for var in list; do ... done | list 可以是序列或数组 | 遍历执行 | 数组索引和序列生成 | 注意 in 后空格 | for i in {1..5}; do echo $i; done |
循环 while | while [ condition ]; do ... done | 条件表达式 | 条件为真循环执行 | 无限循环风险 | break/continue 使用 | while [ $i -le 5 ]; do echo $i; i=$((i+1)); done |
重定向输出 | > / >> | > 覆盖,>> 追加 | 写入文件 | 覆盖风险 | 权限不足会失败 | echo "test" > file.txt |
标准输入 | < | 文件输入 | 命令读取文件 | 输入格式 | 文件必须存在 | sort < file.txt |
管道 | `cmd1 | cmd2` | cmd1 输出作为 cmd2 输入 | 数据流传递 | 阻塞问题 | 多管道组合 |
数组 | arr=(a b c) | ${arr[i]} 访问 | 保存多个值 | 索引越界 | 空格和引号注意 | 循环打印数组元素 |
字符串操作 | ${var#prefix} / ${var%suffix} | 删除前缀/后缀 | 返回处理后字符串 | 语法复杂 | 注意 # 和 ## 区别 | 删除路径前缀 |
函数返回状态 | return n | 0 成功,非0失败 | $? 获取返回值 | 只能返回整数 | echo 输出不能作为 return | 函数 return 1 后 echo $? |
exit | exit n | 退出状态 | 终止脚本执行 | 区分函数 return 和脚本 exit | exit 会终止整个脚本 | 脚本中使用 exit 测试 |
条件表达式 | [ ] / [[ ]] | 文件测试 -f -d,字符串 -z -n,数字 -eq -ne | 返回 true/false | [] vs [[ ]] | [[ ]] 支持 && | |
运算符 | $(( expression )) | 算术运算 | 返回整数结果 | 括号用法 | 空格问题 | i=$((i+1)) |
注释 | # | 单行注释 | 无 | 无 | 多行需要多个 # | 写注释测试 |
读入 | read var | 从标准输入读取 | 变量赋值 | 输入回车问题 | -p 提示信息 | read name; echo $name |
系统调用
系统编程(二)系统调用函数-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
打开文件 | open(pathname, flags, mode) | pathname, flags, mode | 成功返回 fd,失败 -1 | flags 与 mode 组合 | 权限错误 | 打开文件写入后关闭 |
读取文件 | read(fd, buf, count) | fd, buf, count | 返回读取字节数,EOF 返回 0 | 阻塞与非阻塞 | 缓冲区大小 | 读取文件内容打印 |
写文件 | write(fd, buf, count) | fd, buf, count | 返回写入字节数 | 管道写满阻塞 | 注意长度和权限 | 写入文件后查看 |
关闭文件 | close(fd) | fd | 成功 0,失败 -1 | 文件描述符复用 | 不要重复使用 fd | 关闭后访问测试 |
创建进程 | fork() | 无 | 父返回子 PID,子返回 0 | 父子执行顺序不确定 | 栈/堆独立,fd 继承 | fork 后父子打印标识 |
替换进程映像 | exec() 系列 | 参数数组以 NULL 结尾 | 成功不返回,失败 -1 | 参数和环境变量 | execl/execlp/execv/execvp 区别 | fork 后 exec ls -l |
等待子进程 | wait() / waitpid() | pid, &status, options | 返回子 PID | 防止僵尸 | exit 与 _exit 区别 | fork 后 wait 回收 |
退出进程 | exit(status) / _exit(status) | status | 无返回 | exit 会刷新 stdio | exit vs _exit | fork 子进程调用测试 |
创建管道 | pipe(fd[2]) | fd[0] 读端, fd[1] 写端 | 成功 0 | 阻塞问题 | 必须在 fork 前创建 | 父写子读数据 |
进程与父子进程
系统编程(三):进程、父子关系与资源回收-CSDN博客
系统编程(三)进程的究极扩展-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
进程创建 | fork() / vfork() | 无 | 父返回子 PID,子返回 0 | vfork 阻塞父进程 | 栈/堆独立 | fork 打印 PID |
父子继承 | 文件描述符、环境变量 | 无 | 继承资源 | fd 共享可能冲突 | 注意关闭未用端 | 父写文件,子读文件 |
独立资源 | 栈、堆 | 无 | 修改互不影响 | 地址空间复制机制 | 子修改堆不影响父 | 子进程堆变量实验 |
回收子进程 | wait() / waitpid() | pid, &status | 成功返回子 PID | 防止僵尸 | exit 与 _exit 区别 | fork 后 wait 回收 |
信号
系统编程(四)进程间通信-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
信号注册 | signal(signum, handler) | signum, handler | 成功返回旧 handler,失败 SIG_ERR | 异步执行 | 避免非重入函数 | 捕获 SIGINT 打印提示 |
高级信号 | sigaction(signum, act, oldact) | signum, act, oldact | 成功返回 0 | 配置复杂 | 可阻塞信号 | 捕获 SIGCHLD 防止僵尸 |
发送信号 | kill(pid, signum) | pid, signum | 成功 0,失败 -1 | 信号类型理解 | kill -9 强制结束 | fork 后子进程 kill |
信号屏蔽 | sigprocmask(how, set, oldset) | how: BLOCK/UNBLOCK | 成功 0 | 阻塞与解除理解 | 避免屏蔽关键 | 屏蔽 SIGINT 测试 |
匿名管道(pipe)
系统编程(五)进程间通信-管道-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
创建管道 | pipe(fd[2]) | fd[0] 读端,fd[1] 写端 | 成功 0,失败 -1 | 阻塞与非阻塞读写 | 必须在 fork 前创建 | 父写子读数据测试 |
读数据 | read(fd[0], buf, size) | fd, buf, size | 成功返回读字节数,EOF 返回 0 | 阻塞读,部分读 | 读写顺序匹配 | 子进程读取父进程写入的内容 |
写数据 | write(fd[1], buf, size) | fd, buf, size | 成功返回写字节数 | 阻塞写,管道满 | 注意写入长度 | 父进程写 hello |
关闭管道 | close(fd) | fd | 成功 0 | 文件描述符复用 | 父子各自关闭未用端 | 关闭写端后子读 EOF |
命名管道(FIFO)
系统编程(五)进程间通信-管道-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
创建 FIFO | mkfifo(path, mode) | path:管道路径;mode:权限 | 成功 0,失败 -1 | 文件存在报错 | 权限设置 | mkfifo /tmp/myfifo |
打开管道 | open(path, flags) | flags: O_RDONLY/O_WRONLY/O_NONBLOCK | 返回 fd | 阻塞 vs 非阻塞 | O_NONBLOCK 不同效果 | 父写子读 |
读写数据 | read(fd, buf, size) / write(fd, buf, size) | fd, buf, size | 成功返回字节数 | 阻塞问题 | 管道缓冲区满/空 | 父写“hello”,子读并打印 |
删除管道 | unlink(path) | path | 成功 0 | 删除时仍被使用 | 避免删除使用中管道 | 删除 FIFO 后再访问测试 |
消息队列
系统编程(六)进程间通信-消息队列-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
创建队列 | msgget(key, flags) | key, flags | 返回队列 ID,失败 -1 | key 唯一 | IPC_CREAT 避免重复 | 创建队列打印 ID |
发送消息 | msgsnd(msqid, msgp, msgsz, msgflg) | msqid, msgp, msgsz, msgflg | 成功 0 | 队列满阻塞 | 消息长度 ≤ 队列限制 | 发送消息并查看接收 |
接收消息 | msgrcv(msqid, msgp, msgsz, msgtyp, msgflg) | msqid, msgp, msgsz, msgtyp, msgflg | 返回接收字节数 | 阻塞/非阻塞 | msgtyp 匹配 | 接收指定类型消息 |
删除队列 | msgctl(msqid, IPC_RMID, NULL) | msqid | 成功 0 | 队列仍被使用 | 确保无进程使用 | 删除队列后访问测试 |
共享内存
系统编程(七)存储映射与共享内存-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
创建共享内存 | shmget(key, size, flags) | key, size, flags | 返回共享内存 ID | key 唯一性 | size 合理 | 创建 1KB 共享内存 |
连接共享内存 | shmat(shmid, addr, flags) | shmid, addr(NULL), flags | 返回指针 | 并发访问 | 使用前需初始化 | 父写数据,子读数据 |
分离共享内存 | shmdt(addr) | addr | 成功 0 | 不重复分离 | 确保不再使用 | 子进程退出前 detach |
删除共享内存 | shmctl(shmid, IPC_RMID, NULL) | shmid | 成功 0 | 仍被使用时删除 | 删除前确保无进程使用 | 删除后访问失败 |
存储映射
系统编程(七)存储映射与共享内存-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
文件映射 | mmap(addr, length, prot, flags, fd, offset) | addr, length, prot, flags, fd, offset | 返回映射起始地址,失败 MAP_FAILED | MAP_SHARED vs MAP_PRIVATE | fd 必须可访问 | mmap 文件修改测试 |
解除映射 | munmap(addr, length) | addr, length | 成功 0 | 长度必须准确 | 避免重复解除 | 修改后 munmap 再访问 |
文件同步 | msync(addr, length, flags) | addr, length, flags | 成功 0 | 同步策略 | MS_SYNC 阻塞 | 修改 mmap 区域同步到磁盘 |
匿名映射 | `mmap(NULL, length, prot, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)` | length, prot | 返回内存地址 | 匿名映射无文件 | 无 fd |
线程(pthread)
系统编程(八)线程-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
创建线程 | pthread_create(&thread, attr, start_routine, arg) | thread, attr, start_routine, arg | 成功 0 | 参数和返回值 | 必须指针传参 | 创建线程打印信息 |
退出线程 | pthread_exit(retval) | retval | 无返回 | 区分进程退出 | 主线程 join | 在线程内部调用 pthread_exit |
等待线程 | pthread_join(thread, &retval) | thread, retval | 成功 0 | 防止僵尸线程 | join 后回收资源 | 多线程 join 打印返回值 |
分离线程 | pthread_detach(thread) | thread | 成功 0 | 分离线程不可 join | 避免资源泄漏 | detach 后线程自动回收 |
获取线程 ID | pthread_self() | 无 | 返回线程 ID | 无 | 无 | 打印当前线程 ID |
同步与互斥
系统编程(九)同步与互斥-CSDN博客
功能/概念 | 函数/关键字 | 参数说明 | 返回值/效果 | 难易点 | 注意事项 | 示例/实验提示 |
---|---|---|---|---|---|---|
互斥锁初始化 | pthread_mutex_init(&mutex, attr) | mutex, attr | 成功 0 | 锁类型 | 默认 PTHREAD_MUTEX_DEFAULT | 初始化锁后保护共享变量 |
加锁 | pthread_mutex_lock(&mutex) | mutex | 成功 0 | 阻塞锁,死锁风险 | 必须解锁 | 多线程共享资源加锁实验 |
尝试加锁 | pthread_mutex_trylock(&mutex) | mutex | 成功 0,失败 EBUSY | 非阻塞 | 避免死循环 | 资源忙时 trylock |
解锁 | pthread_mutex_unlock(&mutex) | mutex | 成功 0 | 忘记解锁死锁 | 成对使用 lock/unlock | 修改共享变量再 unlock |
条件变量初始化 | pthread_cond_init(&cond, attr) | cond, attr | 成功 0 | 条件变量配合 mutex | 必须加锁 | 初始化后等待条件 |
等待条件 | pthread_cond_wait(&cond, &mutex) | cond, mutex | 阻塞等待条件 | 虚假唤醒 | 与互斥锁配合 | 线程等待条件变量,其他线程 signal |
条件变量唤醒 | pthread_cond_signal(&cond) / pthread_cond_broadcast(&cond) | cond | 唤醒一个或所有等待线程 | signal vs broadcast | 信号可能丢失 | 一个线程 signal,多个线程等待 |