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[] 和 [[ ]] 区别空格必须严格判断文件是否存在
循环 forfor var in list; do ... donelist 可以是序列或数组遍历执行数组索引和序列生成注意 in 后空格for i in {1..5}; do echo $i; done
循环 whilewhile [ condition ]; do ... done条件表达式条件为真循环执行无限循环风险break/continue 使用while [ $i -le 5 ]; do echo $i; i=$((i+1)); done
重定向输出> / >>> 覆盖,>> 追加写入文件覆盖风险权限不足会失败echo "test" > file.txt
标准输入<文件输入命令读取文件输入格式文件必须存在sort < file.txt
管道`cmd1cmd2`cmd1 输出作为 cmd2 输入数据流传递阻塞问题多管道组合
数组arr=(a b c)${arr[i]} 访问保存多个值索引越界空格和引号注意循环打印数组元素
字符串操作${var#prefix} / ${var%suffix}删除前缀/后缀返回处理后字符串语法复杂注意 # 和 ## 区别删除路径前缀
函数返回状态return n0 成功,非0失败$? 获取返回值只能返回整数echo 输出不能作为 return函数 return 1 后 echo $?
exitexit n退出状态终止脚本执行区分函数 return 和脚本 exitexit 会终止整个脚本脚本中使用 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,失败 -1flags 与 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 会刷新 stdioexit vs _exitfork 子进程调用测试
创建管道pipe(fd[2])fd[0] 读端, fd[1] 写端成功 0阻塞问题必须在 fork 前创建父写子读数据

进程与父子进程

系统编程(三):进程、父子关系与资源回收-CSDN博客

系统编程(三)进程的究极扩展-CSDN博客

功能/概念函数/关键字参数说明返回值/效果难易点注意事项示例/实验提示
进程创建fork() / vfork()父返回子 PID,子返回 0vfork 阻塞父进程栈/堆独立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博客

功能/概念函数/关键字参数说明返回值/效果难易点注意事项示例/实验提示
创建 FIFOmkfifo(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,失败 -1key 唯一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返回共享内存 IDkey 唯一性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_FAILEDMAP_SHARED vs MAP_PRIVATEfd 必须可访问mmap 文件修改测试
解除映射munmap(addr, length)addr, length成功 0长度必须准确避免重复解除修改后 munmap 再访问
文件同步msync(addr, length, flags)addr, length, flags成功 0同步策略MS_SYNC 阻塞修改 mmap 区域同步到磁盘
匿名映射`mmap(NULL, length, prot, MAP_ANONYMOUSMAP_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 后线程自动回收
获取线程 IDpthread_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,多个线程等待

信号量(补充部分)

函数/操作函数原型参数说明功能说明返回值适用场景
System V 信号量
semgetint semget(key_t key, int nsems, int semflg);key:信号量键值
nsems:信号量个数
semflg:标志位(IPC_CREAT, 权限0666)
创建或获取一个信号量集成功返回信号量集ID,失败返回-1多进程共享信号量,经典IPC方式
semctlint semctl(int semid, int semnum, int cmd, ...);semid:信号量集ID
semnum:信号量编号
cmd:操作命令(SETVAL, GETVAL, IPC_RMID等)
union semun:可选,传递值
控制信号量(设置值、获取值、删除等)依命令不同,成功返回0或值,失败返回-1管理信号量的值和状态
semopint semop(int semid, struct sembuf *sops, size_t nsops);semid:信号量集ID
sops:操作数组
nsops:操作个数
struct sembuf { sem_num, sem_op, sem_flg }
对信号量进行P/V操作(-1=wait, +1=post)成功返回0,失败返回-1实现多进程互斥或同步
POSIX 无名信号量(线程间/进程间)
sem_initint sem_init(sem_t *sem, int pshared, unsigned int value);sem:信号量指针
pshared:0=线程间共享,非0=进程间共享
value:初始值
初始化信号量成功返回0,失败返回-1线程或进程间同步
sem_destroyint sem_destroy(sem_t *sem);sem:信号量指针销毁信号量,释放资源成功返回0,失败返回-1线程结束后清理资源
sem_waitint sem_wait(sem_t *sem);sem:信号量指针P操作,信号量-1,阻塞等待成功返回0,失败返回-1等待资源可用
sem_trywaitint sem_trywait(sem_t *sem);sem:信号量指针P操作,非阻塞,如果资源不可用立即返回成功返回0,失败返回-1需要非阻塞尝试获取资源
sem_postint sem_post(sem_t *sem);sem:信号量指针V操作,信号量+1,唤醒等待线程成功返回0,失败返回-1释放资源或通知其他线程
sem_getvalueint sem_getvalue(sem_t *sem, int *sval);sem:信号量指针
sval:存储信号量值
获取当前信号量值成功返回0,失败返回-1查看信号量状态
POSIX 有名信号量
sem_opensem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);name:信号量名字(如 "/mysem")
oflag:O_CREAT, O_EXCL
mode:权限
value:初始值
创建/打开一个有名信号量成功返回 sem_t*,失败返回 SEM_FAILED跨进程共享信号量
sem_closeint sem_close(sem_t *sem);sem:信号量指针关闭有名信号量成功返回0,失败返回-1不再使用信号量时关闭
sem_unlinkint sem_unlink(const char *name);name:信号量名字删除有名信号量成功返回0,失败返回-1清理有名信号量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/98088.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/98088.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/98088.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(2、字符翻转)

参考程序&#xff1a;#include <bits/stdc.h> using namespace std;int main() {string s;cin >> s; // 读取输入字符串&#xff0c;若无输入则结束for (int i 0; i < (int)s.size(); i) {// i 从 0 开始&#xff0c;位置是 i1&#xff1b;如果 i 是奇数&#…

Django基础环境入门

熟悉过程 搭建环境&#xff0c;运行起来基础请求到服务接口跟java web对比 说明先不纠结细节先跑起来再说 1. 环境搭建 python已经安装&#xff0c;使用conda管理 django安装 django官方文档 pip install django也可以命令创建 mkdir djangotutorial django-admin startp…

408学习之c语言(结构体)

今天给大家分享C语言中结构体的几种常见使用方法&#xff0c;包括基础结构体定义与初始化&#xff0c;结构体指针的两种访问方式&#xff0c;结构体数组的遍历&#xff0c;动态内存分配与结构体使用&#xff0c;typedef简化结构体类型基础结构体定义与使用#define _CRT_SECURE_…

Navicat中设计表格默认值时,如何不设置成NULL,而是设置成空文本?

在 Navicat 中设计表时&#xff0c;将字段的默认值设置为空文本而不是 NULL 是一个非常常见的需求。操作很简单&#xff0c;但有几个细节需要注意。■ 方法一&#xff1a;通过“设计表”界面设置&#xff08;最常用&#xff09;1. 连接数据库并找到表&#xff1a;在左侧连接导…

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)

预告下一本 可能是mysql8的书籍 或者是AI应用工程的基本岗位所有技能 问题1 什么是 线程安全&#xff1f;在 Java 中如何定义“线程安全”&#xff1f;线程安全&#xff08;Thread Safety&#xff09; 的定义是&#xff1a; 当多个线程同时访问某个类的对象时&#xff0c;无论运…

【医疗 AI】Baichuan-M2:大语言模型在医疗领域的动态验证框架

Baichuan-M2 医疗大模型&#xff1a;技术解读与使用方法 Baichuan-M2&#xff1a;大语言模型在医疗领域的动态验证框架 【医疗 AI】Baichuan-M2&#xff1a;大语言模型在医疗领域的动态验证框架0. Baichuan-M2 模型简介0.1 基本信息0.2 主要贡献0.3 论文摘要1. 引言2. 验证系统…

Ubuntu\Linux环境中驱动版本配置cudaToolKit

修改环境变量。 1. 首先检查当前的环境变量 # 查看当前PATH echo $PATH# 查看当前LD_LIBRARY_PATH echo $LD_LIBRARY_PATH# 查看当前CUDA_HOME echo $CUDA_HOME2. 确定正确的CUDA安装路径 # 查看系统中有哪些CUDA版本 ls /usr/local/cuda*3. 修改环境变量(永久生效) 编辑…

Linux基础开发工具(gcc/g++,yum,vim,make/makefile)

目录 软件包管理器——yum Linux下&#xff0c;软件的安装 yum与软件包的关系 yum命令的运用 1.查看软件包 2.安装/删除软件包 编辑器——vim vim的基本概念 vim的基本操作 命令模式命令 移动光标 删除文字 撤销上一次操作 跳至指定的行 底行模式命令 编译器——…

数据结构之跳表

跳表&#xff08;Skip List&#xff09;是一种基于概率平衡的数据结构&#xff0c;通过多层有序链表实现高效的查找、插入和删除操作。它在最坏情况下时间复杂度为 (O(n))&#xff0c;但通过随机化设计&#xff0c;平均时间复杂度可优化至 (O(\log n))&#xff0c;与平衡二叉搜…

线程概念,控制

一、线程概念 线程概念&#xff1a;进程内部的一个执行流&#xff0c;轻量化。 观点&#xff1a;进程是系统分配资源的基本单位&#xff0c;线程是CPU调度的基本单位。 在理解线程之前&#xff0c;我们在谈一下虚拟地址空间。 我们都知道进程是通过页表将虚拟地址转化为物理地址…

RabbitMQ 高可用实战篇(Mirrored Queue + Cluster + 持久化整合)

RabbitMQ 高可用实战篇&#xff08;Mirrored Queue Cluster 持久化整合&#xff09;1. 前言 在生产环境中&#xff0c;单节点 RabbitMQ 容易因故障导致消息丢失或业务中断。 通过高可用队列、集群部署和持久化策略&#xff0c;可以保证 消息可靠性、节点容错和持续服务。 本文…

支持向量机:从理论到实践

支持向量机&#xff1a;从理论到实践 文章目录支持向量机&#xff1a;从理论到实践一。理论概述1. 线性可分支持向量机1.1 基本概念与数学形式1.2 函数间隔与几何间隔1.3 间隔最大化与优化问题1.4 拉格朗日对偶理论与求解1.5 支持向量与决策函数2. 近似线性可分数据&#xff08…

LVS与Keepalived详解(二)LVS负载均衡实现实操

文章目录前言一、LVS-DR 模式详解1.1 数据包流向分析1.2 DR 模式的特点二、LVS-DR 集群部署实战2.1 环境准备2.2 配置负载调度器&#xff08;Director Server&#xff09;2.3 配置节点服务器&#xff08;Real Server&#xff09;2.4 测试验证三、前期回顾3.1 LVS 三种工作模式及…

归一化实现原理

归一化&#xff08;Normalization&#xff09;是一种将数据转换到相同尺度的预处理技术&#xff0c;它通常用于让不同特征&#xff08;或数据项&#xff09;具有相同的量纲或范围。在联邦学习中&#xff0c;归一化可以用来处理非独立同分布&#xff08;Non-IID&#xff09;**数…

企业级实战:构建基于Qt、C++与YOLOv8的模块化工业视觉检测系统

一、概述 在追求高效与精密的现代制造业中&#xff0c;自动化光学检测&#xff08;AOI&#xff09;已成为保障产品质量的核心技术。传统的质检流程往往受限于人工效率与主观判断&#xff0c;难以满足大规模、高精度的生产需求。本文旨在研发一套完整的、企业级的工业视觉异常检…

【目标检测】metrice_curve和loss_curve对比图可视化

代码如下&#xff1a; import warnings warnings.filterwarnings(ignore)import os import pandas as pd import numpy as np import matplotlib.pylab as pltpwd os.getcwd()names [model1, model2, model3,ours]plt.figure(figsize(10, 10))plt.subplot(2, 2, 1) for i in …

【LeetCode hot100|Week2】滑动窗口,子串

笔记用于个人复习和巩固&#xff0c;题解非原创&#xff0c;参考LeetCode官方题解以及各个大佬的解法&#xff0c;希望给大家带来帮助&#xff0c;同时笔记也能督促我学习进步 这周主要把滑动窗口和子串的题目刷了一遍 文章目录Week2D1 滑动窗口209. 长度最小的子数组713. 乘积…

vue2纯前端对接海康威视摄像头实现实时视频预览

vue2纯前端对接海康威视摄像头实现实时视频预览一、环境准备二、代码集成1.1 准备webrtcstreamer.js&#xff0c;粘贴即用&#xff0c;不用做任何修改1.2 封装视频组件&#xff0c;在需要视频的地方引入此封装的视频组件即可&#xff0c;也是粘贴即用&#xff0c;注意其中impor…

Android 设置禁止截图和禁止长截图

1.禁止截图 在 Activity 代码中 , 可以在调用 setContentView 函数之前 ,为 Window 窗口对象 设置 LayoutParams.FLAG_SECURE 标志位 , 可以禁止对本界面进行截屏 ,Window 窗口对象 , 可通过 getWindow 方法获取 ,核心代码如下 :getWindow().setFlags(LayoutParams.FLAG_SECUR…

AR 巡检在工业的应用|阿法龙XR云平台

AR 巡检的应用覆盖电力、石油化工、智能制造、轨道交通、冶金等对设备可靠性和安全性要求极高的行业&#xff0c;具体场景包括&#xff1a;电力行业变电站内设备的状态检查&#xff1a;通过 AR 眼镜扫描设备&#xff0c;实时显示设备额定参数、历史故障记录、实时传感器数据&am…