当前位置: 首页 > news >正文

嵌入式学习-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(内核空间)是所有进程共有的。

进程三段

  1. 数据段:存放的是全局变量,常数,static修饰的变量等。
  2. 正文段:存放的是程序中的代码。
  3. 堆栈段:存放的是函数的返回地址,函数的参数以及程序中的局部变量

进程的类型

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

  1. 运行态(R):此时正在运行或者准备运行的进程。
  2. 睡眠态(等待态):可中断的睡眠态(S):处于等待状态中的进程,一旦被该进程等待的资源被释放,那么该进程就会进入运行状态。
  3. 不可中断的睡眠态(D):该状态的进程只能用wake_up()函数唤醒。
  4. 暂停态(T):进程被暂停或者终止
  5. 死亡态:进程结束 X
  6. 僵尸态(Z):当进程已经终止运行,但还占用系统资源,要避免僵尸态的产生

进程状态转换图(重点)

进程创建后,进程进入就绪态,当CPU调度到此进程时进入运行态,当时间片用完时,此进程会进入就绪态,如果此进程正在执行一些IO操作(阻塞操作)会进入阻塞态,完成IO操作(阻塞结束)后又可进入就绪态,等待CPU的调度,当进程运行结束即进入结束态。

进程的函数接口

创建进程fork

pid_t fork(void);
功能:创建子进程
返回值:
    成功:在父进程中:返回子进程的进程号 >0
         在子进程中:返回值为0
    失败:-1并设置errno

示例代码:

fork函数创建的子进程的特点

  1. fork创建一个子进程,父进程返回子进程的pid,子进程中返回0。
  2. fork创建的子进程几乎拷贝了父进程所有的内容(三个段:堆栈、数据、代码),fork之前的代码被复制并不会被执行,fork之后的代码被复制并执行。
  3. fork创建进程一旦成功,进程之间的空间就相会独立。各自分配0-4G的虚拟内存空间
  4. fork创建进程之前打开的文件可以通过复制拿到同一个文件描述符 操作同一个文件(同一个文件指针)
  5. 如果父进程退出,子进程没有退出,子进程会变成孤儿进程被init进程收养。变成后台进程。

相关文章:

嵌入式学习-IO进程-Day03

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

docker安装elasticsearch和ik分词器

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

|智能门票|008_django基于Python的智能门票设计与实现2024_i16z2v70

目录 系统展示 设计步骤 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…...

QFramework v1.0 使用指南 更新篇:20240919. 新增 BindableDictionary

增加了三个比较常用的屏幕过渡&#xff1a;FadeIn&#xff0c;FadeOut&#xff0c;FadeInOut。 示例代码如下: using UnityEngine;namespace QFramework.Example {public class ScreenTransitionsExample : MonoBehaviour{private void OnGUI(){IMGUIHelper.SetDesignResolut…...

vue实现文件预览和文件上传、下载、预览——多图、模型、dwg图纸、文档(word、excel、ppt、pdf)

整体思路&#xff08;模型特殊不考虑&#xff0c;别人封装不具备参考性&#xff09; 图片上传采用单独的组件&#xff0c;其他三种类型采用一个上传组件&#xff08;仅仅文件格式不同&#xff09;文件上传采用前端直接上传阿里云的方式图片预览使用elementUI自带的image预览dw…...

探讨人工智能领域所需学习的高等数学知识及其应用场景,涵盖了微积分、线性代数、概率论等多个数学分支。

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

详解安卓和IOS的唤起APP的机制,包括第三方平台的唤起方法比如微信

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

服务器数据恢复—raid5阵列中多块硬盘离线导致崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; 三台V7000存储&#xff0c;共有64块SAS硬盘&#xff08;其中有三块热备盘&#xff0c;其中一块已启用&#xff09;组建了数组raid5阵列。分配若干LUN&#xff0c;上层安装Windows server操作系统&#xff0c;数据分区格式化为NTFS文件系统。 服…...

《深度学习》OpenCV FisherFaces算法人脸识别 原理及案例解析

目录 一、FisherFaces算法 1、什么是FisherFaces算法 2、原理 3、特点 4、算法步骤 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;LDA降维 4&#xff09;特征投影 5&#xff09;人脸识别 二、案例解析 1、完整代码 运行结果&#xff1a; 一、Fish…...

基于Python+Flask的天气预报数据可视化分析系统(源码+文档)

简介&#xff1a; 本系统是一个集数据收集、处理、分析和可视化于一体的天气预报数据平台。通过Python和Flask框架的结合&#xff0c;我们能够高效地构建出一个用户友好的Web界面&#xff0c;让用户能够轻松访问并理解复杂的天气数据。系统不仅能够实时获取最新的天气信息&…...

深入解析 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 项目&#xff1a;引入 Spring Web 依赖&#xff0c;把前端的页面放入项目中 **<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport"…...

电脑d盘不见了怎么恢复?

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

电子商务网站维护技巧:保持WordPress、主题和插件的更新

在这个快节奏的数字时代&#xff0c;维护一个电子商务网站的首要任务之一是保持WordPress、主题和插件的最新状态。过时的软件不仅可能导致功能故障&#xff0c;还可能带来安全风险。本文将深入探讨如何有效地更新和维护您的WordPress网站&#xff0c;以确保其安全性和性能。 …...

交叉编译--目标平台aarch64 ubuntu 22.04

开发宿主机&#xff1a; ubuntu22.04虚拟机&#xff08;PC&#xff09; 目标平台&#xff1a; 地平线x3派/x3 Module , ubuntu22.04&#xff0c; ros2 humble 基于地平线x3开发板 5核 4G的内存的有限的资源&#xff0c;直接在目标机上编译虽然也可以&#xff0c;但耗时太长&a…...

【pytorch】昇思大模型配置python的conda版本

首先&#xff0c;切换conda的源&#xff0c;可以参考这篇文章&#xff0c;如果python的版本比较老的话不推荐使用清华源。 比如算子开发文档中推荐的python版本是3.7.5&#xff0c;比较老&#xff0c;使用清华源无法安装。 之后就是比较重要的&#xff0c;修改~/.bashrc。 把…...

nodejs的卸载和nvm安装

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

网络七层架构

目录标题 网络七层架构从正确认识网络七层架构开始 网络七层架构 简介&#xff1a; 网络七层架构是指ISO/OSI模型&#xff0c;它是国际标准化组织&#xff08;ISO&#xff09;制定的一种用于计算机网络体系结构的参考模型。该模型将计算机网络的功能划分为七个层次&#xff0c…...

2024年华为OD机试真题-敏感字段加密-Java-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述 给定一个由多个…...

图神经网络黑书笔记--术语

一、图的基本概念 图由节点集合和边集合组成。节点代表实体&#xff0c;边代表实体之间的关系。节点、边、整个图都可以与丰富的信息相关联&#xff0c;这些信息被表征为节点/边/图的特征。 中心度&#xff1a;是度量节点的重要性。如果许多其他重要的节点也连接到该节点&a…...

原型基于颜色的图像检索与MATLAB

原型基于颜色的图像检索与MATLAB 摘要 基于内容的检索数据库(图像)已经变得越来越受欢迎。为了达到这一目的&#xff0c;需要发展算法检测/模拟工具&#xff0c;但市场上没有合适的商业工具。 本文介绍了一个模拟环境&#xff0c;能够从数据库中检索图像直方图的相似之处。该…...

【C++笔试强训】如何成为算法糕手Day9

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 添加逗号 思路&#xff1a; 代码实现&#xff1a; 跳台阶 思路&#xff1a; 代码实现&#xff1a; 扑克牌顺子 思路&#xf…...

初识算法 · 二分查找(1)

目录 前言&#xff1a; 二分查找 题目解析 算法原理 算法编写 搜索插入位置 题目解析 算法原理 算法编写 前言&#xff1a; 本文呢&#xff0c;我们从滑动窗口窗口算法移步到了二分查找算法&#xff0c;我们简单了解一下二分查找算法&#xff0c;二分查找算法是一个十…...

数据结构:数字统计

请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&#xff0c;在数21中出现1次&#xff0c;在数22中出现2次&#xff0c;所以数字2在该范围…...

网页前端开发之HTML入门

HTML入门 HTML全称HyperText Markup Language&#xff0c;中文译为&#xff1a;超文本标记语言。 它有一个同胞兄弟叫&#xff1a;XML&#xff0c;全称Extensible Markup Language&#xff0c;中文译为&#xff1a;可扩展标记语言。 简单来讲&#xff0c;它们都是标记语言。 …...

Python do while 实现案例

在 Python 中没有传统的 do while 循环语法。 但是可以通过使用 while True 结合条件判断来实现类似 do while 的效果。 一、语法 while True:# 执行某些操作#...if not condition:break 这里先无条件地执行一次循环体中的代码&#xff0c;然后在每次循环结束时检查条件&#…...

docker网络管理详解 一

一 生产故障&#xff1a;docker 同一宿主机不能通信 1. 检查容器网络配置 1.1 查看容器的网络信息 使用 docker inspect 命令查看容器的网络配置&#xff0c;确保它们连接到了正确的网络。 docker inspect -f {{json .NetworkSettings.Networks }} container1 docker inspe…...

前端使用Canvas实现网页电子签名(撤销、下载)

前言&#xff1a;一般在一些后台的流程资料以及审核的场景中会需要电子签名&#xff0c;介绍一种用canvas实现的电子签名&#xff0c;此案例用的是原生js 效果展示&#xff1a; 一、html和css&#xff1a; <div class"divCla2"><canvas id"myCanvas&q…...

Lepus安装与配置管理(Lepus Installation and Configuration Management)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...

Tomcat中存放图片文件丢失问题

1、tomcat中存放的图片丢失原因&#xff1a; tomcat 在处理 WAR 包时&#xff0c;会在部署时解压 WAR 包并创建文件夹。如果在 tomcat 运行时删除了 WAR 包&#xff0c;tomcat会检测到这种变化&#xff0c;然后可能会自动清理已解压的文件夹。这是tomcat默认的行为&#xff0c;…...