嵌入式学习-IO进程-Day03
嵌入式学习-IO进程-Day03
IO进程
获取文件属性(stat)
库
库的概念
库的分类
静态库的制作
动态库的制作
进程
进程和程序的区别
进程的特点
进程三段
进程的类型
进程的运行状态
进程状态转换图(重点)
进程的函数接口
创建进程fork
fork函数创建的子进程的特点
IO进程
获取文件属性(stat)
头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
函数
int stat(const char *pathname, struct stat *statbuf);
功能:获取文件的属性
参数:pathname:文件
buf:获取文件属性存放的位置
成功返回0,失败返回-1,更新错误码结构体包含
struct stat {
dev_t st_dev; /* ID of device containing file */
包含文件的设备ID
ino_t st_ino; /* inode number */文件的Inode号
mode_t st_mode; /* protection */ 文件类型和权限
nlink_t st_nlink; /* number of hard links */硬链接数
uid_t st_uid; /* user ID of owner */用户ID
gid_t st_gid; /* group ID of owner */组ID
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */大小
blksize_t st_blksize; /* blocksize for filesystem I/O *
文件系统I/O的块大小
blkcnt_t st_blocks; /* number of 512B blocks allocated */ 512B块的分配数量/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
从Linux 2.6开始,内核支持纳秒
以下时间戳字段的精度。
Linux 2.6之前版本的详细信息请参见“说明”。struct timespec st_atim; /* time of last access访问 */struct timespec st_mtim; /* time of last modification修改 */struct timespec st_ctim; /* time of last status change *
打印文件的inode
下面是st_mode的解释
man 7 inode
在man手册的第七页,打开man 7 inodeThe following mask values are defined for the file type:
对于该文件类型,定义了以下掩码值:
st_mode 包含的是文件类型和权限:
文件类型:
S_IFMT 0170000 bit mask for the file type bit field
文件类型位字段的位掩码
S_IFSOCK 0140000 socket-套接字 S_IFLNK 0120000 symbolic link-连接文件
S_IFREG 0100000 regular file-普通文件
S_IFBLK 0060000 block device块设备
S_IFDIR 0040000 directory目录
S_IFCHR 0020000 character 字符设备
S_IFIFO 0010000 FIFO管道 Thus, to test for a regular file (for example), one could write:
因此,要测试一个常规文件(例如),可以编写以下代码:
stat(pathname, &sb);
if ((sb.st_mode & S_IFMT) == S_IFREG) {
/* Handle regular file */
}
获取st_mode的值
100664
&
170000
=
100000S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
将使用规则封装:封装成宏函数
#define S_ISREG(m) (m&S_IFMT)==S_IFREG m就相当于获取到的st_mode的值
相当于if(S_ISREG(sb.st_mode))权限:后9位控制权限
S_IRWXU 00700 owner has read, write, and execute permission
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permissionS_IRWXG 00070 group has read, write, and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permissionS_IRWXO 00007 others (not in group) have read, write, and
execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission使用方法:用谁与谁 st_mode & ???
// 创作者权限
if (st.st_mode & S_IRUSR)
putchar('r');
else
putchar('-');1.getpwuid:通过用户id获取用户名
struct passwd *getpwuid(uid_t uid); struct passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
}; 2.getgrgid:通过组id获取组名
struct group *getgrgid(gid_t gid);
struct group {
char *gr_name; /* group name */
char *gr_passwd; /* group password */
gid_t gr_gid; /* group ID */
char **gr_mem; /* group members */
}; 3.char *ctime(const time_t *timep);
功能:将时间转换为字符串的格式表示
如:"Wed Jun 30 21:49:08 1993\n"
ctime(&st.st_mtime) 函数返回一个指向字符串的指针,这个字符串表示时间格式的日期和时间。标准的 ctime 函数返回的时间字符串格式如下:
Www Mmm dd hh:mm:ss yyyy\n\0解释:
Www:表示星期几:MOn ,TUe
Mmm:表示月份:Jan,Feb
dd:表示日期
hh:mm:ss:时分秒
yyyy:年份。
代码实现ls-l功能
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
int main(int argc, char const *argv[])
{
struct stat sb;
if (stat("./a.txt", &sb) == -1)
{
perror("stat err");
return -1;
}
// type
if (S_ISREG(sb.st_mode))
{
putchar('-');
}
// mode_usr
if (sb.st_mode & S_IRUSR)
{
putchar('r');
}
else
{
putchar('-');
}
// mode_gru
if (sb.st_mode & S_IRGRP)
{
putchar('r');
}
else
{
putchar('-');
}
// mode_other
if (sb.st_mode & S_IROTH)
{
putchar('r');
}
else
{
putchar('-');
}
printf("%ld ", sb.st_nlink);
printf("%s ", getpwuid(sb.st_uid)->pw_name);
printf("%s ", getgrgid(sb.st_gid)->gr_name);
printf("%ld ",sb.st_size);
printf("%.12s",ctime(&sb.st_mtime));
printf("%s ","./a.out");
printf("\n");
return 0;
}
库
库的概念
就是把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用;本质上来说库是一种可执行代码的二进制形式
库的分类
静态库和动态库,本质区别是代码被载入时刻不同。
静态库:程序编译时连接到目标文件。
缺点:静态库中的代码复制到了程序中,因此体积较大。静态库升级后,程序需要重新编译链接
优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快
动态库:程序运行时被载入到代码当中
缺点:运行时需要加载动态库,运行速度慢,移植性差
优点:体积小,升级时候变得更加简单。
动态库 静态库
linux: .so .a
windows: .dll .lib
静态库的制作
将源文件编译生成目标文件
gcc -c xxx.c -o xxx.o
创建静态库,用ar 命令,将.o文件生成.a文件
ar crs libxxx.a xxx.o
lib:库的前缀 xxx.库名
链接库测试使用
gcc xxx.c -L指定库的路径 -l 指定的库名
动态库的制作
创建与地址无关的目标文件
gcc -fPIC -c xxx.c -o xxx.o
创建动态库
gcc -shared -o libxxx.so xxx.o
lib:库的前缀 xxx.库名
测试使用
gcc xxx.c -L指定库的路径 -l 指定的库名
执行
错误原因:
当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件
解决方法:
1.把库拷贝到/usr/lib和/lib目录下
sudo cp libxxx.so /usr/lib
2.在LD_LIBRARY_PATH环境变量中加上库所在路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
注意:只在当前终端,终端关闭,环境变量消失。
3.添加/etc/ld.so.conf.d/*.conf文件
进程
进程和程序的区别
程序:
1. 编译好的可执行的二进制文件。
2. 存放在磁盘上,指令和数据的有序集合(文件)。
3. 静态的,没有任何的执行概念。
进程:
1. 独立的可调度的任务
2. 执行一个程序所分配的资源总称
3.进程就是程序的一次执行的过程
4.进程是动态的,包括创建,调度,执行和消亡
进程的特点
1.CPU调度进程时会给进程分配时间片(几毫秒~十几毫秒),当时间片用完后,cpu再进行其他进程的调度,实现进程的轮转,从而实现多任务的操作
2.系统会为每一个进程分配0-4g的虚拟空间,0-3g(用户空间)是每个进程所独有的,3g-4g(内核空间)是所有进程共有的。
进程三段
- 数据段:存放的是全局变量,常数,static修饰的变量等。
- 正文段:存放的是程序中的代码。
- 堆栈段:存放的是函数的返回地址,函数的参数以及程序中的局部变量
进程的类型
1.交互进程:该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运行。该类进程经常与用户进行交互,需要等待用户的输入,当接收到用户的输入后,该类进程会立刻响应,典型的交互式进程有:shell命令进程、文本编辑器等
2.批处理进程:该类进程不属于某个终端,它被提交到一个队列中以便顺序执行。比如数据备份。
3.守护进程:该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束。
进程的运行状态
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped by job control signal
t stopped by debugger during the tracing
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
- 运行态(R):此时正在运行或者准备运行的进程。
- 睡眠态(等待态):可中断的睡眠态(S):处于等待状态中的进程,一旦被该进程等待的资源被释放,那么该进程就会进入运行状态。
- 不可中断的睡眠态(D):该状态的进程只能用wake_up()函数唤醒。
- 暂停态(T):进程被暂停或者终止
- 死亡态:进程结束 X
-
僵尸态(Z):当进程已经终止运行,但还占用系统资源,要避免僵尸态的产生
进程状态转换图(重点)
进程创建后,进程进入就绪态,当CPU调度到此进程时进入运行态,当时间片用完时,此进程会进入就绪态,如果此进程正在执行一些IO操作(阻塞操作)会进入阻塞态,完成IO操作(阻塞结束)后又可进入就绪态,等待CPU的调度,当进程运行结束即进入结束态。
进程的函数接口
创建进程fork
pid_t fork(void);
功能:创建子进程
返回值:
成功:在父进程中:返回子进程的进程号 >0
在子进程中:返回值为0
失败:-1并设置errno
示例代码:
fork函数创建的子进程的特点
- fork创建一个子进程,父进程返回子进程的pid,子进程中返回0。
- fork创建的子进程几乎拷贝了父进程所有的内容(三个段:堆栈、数据、代码),fork之前的代码被复制并不会被执行,fork之后的代码被复制并执行。
- fork创建进程一旦成功,进程之间的空间就相会独立。各自分配0-4G的虚拟内存空间
- fork创建进程之前打开的文件可以通过复制拿到同一个文件描述符 操作同一个文件(同一个文件指针)。
- 如果父进程退出,子进程没有退出,子进程会变成孤儿进程被init进程收养。变成后台进程。
相关文章:

嵌入式学习-IO进程-Day03
嵌入式学习-IO进程-Day03 IO进程 获取文件属性(stat) 库 库的概念 库的分类 静态库的制作 动态库的制作 进程 进程和程序的区别 进程的特点 进程三段 进程的类型 进程的运行状态 进程状态转换图(重点) 进程的函数接口 创建进程for…...

docker安装elasticsearch和ik分词器
目录 ElasticSearch 了解ElasticSearch ELK技术栈 编辑 ElasticSearch与lucene的关系 总结 倒排索引 正向索引 倒排索引 正向和倒排 elasticSearch特定的一些概念 文档和字段 索引和映射 mysql与elasticsearch对比 安装elasticSeacher并部署单例es 创建网络 加…...

|智能门票|008_django基于Python的智能门票设计与实现2024_i16z2v70
目录 系统展示 设计步骤 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…...

QFramework v1.0 使用指南 更新篇:20240919. 新增 BindableDictionary
增加了三个比较常用的屏幕过渡:FadeIn,FadeOut,FadeInOut。 示例代码如下: using UnityEngine;namespace QFramework.Example {public class ScreenTransitionsExample : MonoBehaviour{private void OnGUI(){IMGUIHelper.SetDesignResolut…...

vue实现文件预览和文件上传、下载、预览——多图、模型、dwg图纸、文档(word、excel、ppt、pdf)
整体思路(模型特殊不考虑,别人封装不具备参考性) 图片上传采用单独的组件,其他三种类型采用一个上传组件(仅仅文件格式不同)文件上传采用前端直接上传阿里云的方式图片预览使用elementUI自带的image预览dw…...

探讨人工智能领域所需学习的高等数学知识及其应用场景,涵盖了微积分、线性代数、概率论等多个数学分支。
大家好,我是微学AI,今天给大家介绍一下本文主要探讨了人工智能领域所需学习的高等数学知识及其应用场景。文章详细列出了人工智能中涉及的数学公式,涵盖了微积分、线性代数、概率论等多个数学分支。同时,本文深入介绍了这些数学知…...

详解安卓和IOS的唤起APP的机制,包括第三方平台的唤起方法比如微信
网页唤起APP是一种常见的跨平台交互方式,它允许用户从网页直接跳转到移动应用程序。 这种技术广泛应用于各种场景,比如让用户在浏览器中点击链接后直接打开某个应用,或者从网页引导用户下载安装应用。实现这一功能主要依赖于URL Scheme、Univ…...

服务器数据恢复—raid5阵列中多块硬盘离线导致崩溃的数据恢复案例
服务器数据恢复环境: 三台V7000存储,共有64块SAS硬盘(其中有三块热备盘,其中一块已启用)组建了数组raid5阵列。分配若干LUN,上层安装Windows server操作系统,数据分区格式化为NTFS文件系统。 服…...

《深度学习》OpenCV FisherFaces算法人脸识别 原理及案例解析
目录 一、FisherFaces算法 1、什么是FisherFaces算法 2、原理 3、特点 4、算法步骤 1)数据预处理 2)特征提取 3)LDA降维 4)特征投影 5)人脸识别 二、案例解析 1、完整代码 运行结果: 一、Fish…...

基于Python+Flask的天气预报数据可视化分析系统(源码+文档)
简介: 本系统是一个集数据收集、处理、分析和可视化于一体的天气预报数据平台。通过Python和Flask框架的结合,我们能够高效地构建出一个用户友好的Web界面,让用户能够轻松访问并理解复杂的天气数据。系统不仅能够实时获取最新的天气信息&…...
深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
目录 写在前面 1. Flutter 的基本适配机制 1.1 响应式布局 1.2 逻辑像素 2. 横屏与竖屏的适配 2.1 方向感知 2.2 针对方向的布局优化 3. 多屏协作的实现 3.1 适配多屏显示 3.2 使用 StreamBuilder 和 Provider 3.3 多设备协作的挑战 4. 实践中的应用场景 4.1 移动办…...

【Spring】Spring实现加法计算器和用户登录
加法计算器 准备工作 创建 SpringBoot 项目:引入 Spring Web 依赖,把前端的页面放入项目中 **<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport"…...

电脑d盘不见了怎么恢复?
在使用电脑的时候,我们可能会遇到这样一个问题,电脑里的D盘突然不见了,在“此电脑”中看不到D盘了。这这个情况可能会让人感到非常困惑甚至是头疼,因为D盘里面可能存放着非常重要的文件。今天的内容要和大家分析一下D盘不见的原因…...

电子商务网站维护技巧:保持WordPress、主题和插件的更新
在这个快节奏的数字时代,维护一个电子商务网站的首要任务之一是保持WordPress、主题和插件的最新状态。过时的软件不仅可能导致功能故障,还可能带来安全风险。本文将深入探讨如何有效地更新和维护您的WordPress网站,以确保其安全性和性能。 …...
交叉编译--目标平台aarch64 ubuntu 22.04
开发宿主机: ubuntu22.04虚拟机(PC) 目标平台: 地平线x3派/x3 Module , ubuntu22.04, ros2 humble 基于地平线x3开发板 5核 4G的内存的有限的资源,直接在目标机上编译虽然也可以,但耗时太长&a…...
【pytorch】昇思大模型配置python的conda版本
首先,切换conda的源,可以参考这篇文章,如果python的版本比较老的话不推荐使用清华源。 比如算子开发文档中推荐的python版本是3.7.5,比较老,使用清华源无法安装。 之后就是比较重要的,修改~/.bashrc。 把…...

nodejs的卸载和nvm安装
由于项目需求,需要多版本控制的nodejs,所以要把原来的nodejs卸载干净,然后再装nvm 常见问题 1.在安装nvm的时候没有卸载node,导致使用nvm安装完之后,node和npm都不可用。 2.在第一次使用nvm安装node后,要…...

网络七层架构
目录标题 网络七层架构从正确认识网络七层架构开始 网络七层架构 简介: 网络七层架构是指ISO/OSI模型,它是国际标准化组织(ISO)制定的一种用于计算机网络体系结构的参考模型。该模型将计算机网络的功能划分为七个层次,…...
2024年华为OD机试真题-敏感字段加密-Java-OD统一考试(E卷)
最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述 给定一个由多个…...
图神经网络黑书笔记--术语
一、图的基本概念 图由节点集合和边集合组成。节点代表实体,边代表实体之间的关系。节点、边、整个图都可以与丰富的信息相关联,这些信息被表征为节点/边/图的特征。 中心度:是度量节点的重要性。如果许多其他重要的节点也连接到该节点&a…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...