IO进程(学习)2024.8.17

news2024/9/22 21:21:08

目录

文件属性获取

目录操作

标准IO 和文件IO 的区别

库的定义

库的分类

静态库

动态库

库的制作

制作静态库

动态库的制作

使用库

进程

程序和进程的区别

程序:编译好的可执行文件

进程:一个独立的可调度的任务

特点

进程段

进程分类

1.交互进程

2.批处理进程

3.守护进程

进程状态

进程状态切换图

就绪状态

执行状态

阻塞状态

文件属性获取

#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
功能:获取文件属性
参数:path:文件路径名
           buf:保存文件属性信息的结构体
返回值:成功:0
              失败:-1

文件属性信息的结构体:
struct stat {
        dev_t    st_dev;        /* 设备ID */
        ino_t     st_ino;        /* inode号 */
        mode_t    st_mode;        /* 文件类型和权限 */
        nlink_t   st_nlink;        /* 硬链接数 */
        uid_t     st_uid;        /* 用户ID */
        gid_t     st_gid;        /* 组ID */
        off_t     st_size;        /* 大小 */
        time_t    st_atime;        /* 最后访问时间 */
        time_t    st_mtime;        /* 最后修改时间 */
        time_t    st_ctime;        /* 最后状态改变时间 */
    };

 stat的案例:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char const *argv[])
{
    struct stat st;

    stat("./test.c", &st);

    printf("%ld\n", st.st_ino);
    printf("%ld\n", st.st_size);
    printf("%ld\n", st.st_nlink);

    if ((st.st_mode & __S_IFMT) == __S_IFBLK)
    {
        putchar('b');
    }
    else if ((st.st_mode & __S_IFMT) == __S_IFCHR)
    {
        putchar('c');
    }
    else if ((st.st_mode & __S_IFMT) == __S_IFDIR)
    {
        putchar('d');
    }
    else if ((st.st_mode & __S_IFMT) == __S_IFREG)
    {
        putchar('-');
    }
    else if ((st.st_mode & __S_IFMT) == __S_IFLNK)
    {
        putchar('l');
    }
    else if ((st.st_mode & __S_IFMT) == __S_IFSOCK)
    {
        putchar('s');
    }
    else if ((st.st_mode & __S_IFMT) == __S_IFIFO)
    {
        putchar('p');
    }

    // 文件权限判断
    // 用户读权限
    // if ((st.st_mode & S_IRUSR) > 0)
    // {
    //     putchar('r');
    // }
    // else
    // {
    //     putchar('-');
    // }

    // 文件权限掩码简化的方法
    char arr[4] = "rwx";
    for (int i = 0; i < 9; i++)
    {
        printf("%c", st.st_mode & (0400 >> i) ? arr[i % 3] : '-');
    }

    // 最后一次修改的时间
    printf("%ld\n", st.st_mtime); // 得到的是秒数
    

    // 用户名获取
    printf("%s\n", getpwuid(st.st_uid)->pw_name);

    // 组名获取
    printf("%s\n", getgrgid(st.st_gid)->gr_name);

    return 0;
}

目录操作

围绕着目录流进行操作,DIR *

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
功能:获得目录流
参数:要打开的目录
返回值:成功:目录流
               失败:NULL

struct dirent *readdir(DIR *dirp);
功能:读目录
参数:要读的目录流
返回值:成功:读到的信息    
               失败或读到目录结尾:NULL
返回值为描述该目录下的文件信息的结构体

该目录下的文件信息的结构体:

struct dirent {
        ino_t   d_ino;        /* 索引节点号*/
        off_t   d_off;        /*在目录文件中的偏移*/
        unsigned short d_reclen;        /* 文件名长度*/
        unsigned char  d_type;        /* 文件类型 */
        char    d_name[256];        /* 文件名 */
};

int closedir(DIR *dirp);
功能:关闭目录
参数:dirp:目录流

标准IO 和文件IO 的区别

标准IO文件IO
概念
在C库中定义的一组输入输出的函数
在posix中定义的一组输入输出的函数
特点
1.有缓冲区,减少系统调用,提高效率

2.围绕流操作,FILE*

3.默认打开三个流:stdin\stdout\stderr

4.只操作普通文件

1.没有缓冲区,每次操作都引起系统调用

2.围绕文件描述符操作

3.默认打开三个文件描述符:0\1\2

4.除目录外其他文件

函数
打开文件:fopen/freopen

关闭文件:fclose

读写文件:fread,fwrite

文件定位:rewind/fseek/ftell

打开文件:open

关闭文件:close

读写文件:read,write

文件定位:lseek

库的定义

库:就是把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用;

本质上来说库是一种可执行代码的二进制形式

cd /usr/lib
lib:库文件

cd /usr/include
include:头文件

由于windows和linux的本质不同,因此二者库的二进制是不兼容的

库的分类

静态库和动态库,本质区别是代码被载入时刻不同。

静态库

静态库在程序编译时会被连接到目标代码中。
        优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快
        缺点:静态库中的代码复制到了程序中,因此体积较大;

静态库升级后,程序需要重新编译链接

动态库

动态库是在程序运行时才被载入代码中。
        优点:程序在执行时加载动态库,代码体积小;程序升级更简单;  
        缺点:运行时还需要动态库的存在,移植性较差

不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

库的制作

制作静态库

1.将源文件编译生成目标文件
    gcc -c add.c -o add.o
2.创建静态库用ar命令,它将很多的.o转换成 .a
    ar crs libmyadd.a add.o
    静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a
3.测试使用静态库
    gcc main.c -L.    -lmyadd        // -L指定库的路径     -l指定库名
    执行:./a.out

动态库的制作

1-我们用gcc来创建共享库
gcc -fPIC  -c hello.c  -o hello.o 
-fPIC 创建与地址无关的编译程序  (就是不和路径进行关联)
gcc  -shared  -o  libmyhello.so  hello.o
2-测试动态库使用
gcc main.c  -L. -lmyhello

可以正常编译通过,但是运行时报错./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directory
原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件
解决方法(有三种):
        (1)把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径) 
        (2)在LD_LIBRARY_PATH环境变量中加上库所在路径。 
                export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. (终端关闭,环境变量就没在了)
        (3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新
                sudo vi xx.conf
                添加动态库存在的路径使用绝对路径

使用库

将库文件放到系统目录/usr/lib  或 /lib
将头文件放在系统目录/usr/include
        #include <xx.h>        如果头文件在当前目录
        #include  "xx.h"        如果头文件在其他目录
        #include "头文件路径/xx.h"        (如果我没有指定路径的话可以使用 gcc)
        #include  "xx.h"                gcc   xx.c  -I 头文件的路径
        -L 路径:指定库的路径
        -l:(L的小写)指定库名
        -I 路径:(i的大写)指定头文件路径

进程

程序和进程的区别

程序:编译好的可执行文件

存放在磁盘上的指令和数据的有序集合(文件)
程序是静态的,没有任何执行的概念

进程:一个独立的可调度的任务

执行一个程序所分配的资源的总称
进程是程序的一次执行过程
进程是动态的,包括创建、调度、执行和消亡

特点

1.系统会为每个进程分配0-4g的虚拟空间,其中0-3g是用户空间,每个进程独有;3g-4g是内核空间,所有进程共享
2.轮转调度:时间片,系统为每个进程分配时间片(几毫秒~几十毫秒),当一个进程时间片用完时,CPU调度另一个进程,从而实现进程调度的切换 (没有外界干预是随机调度)

进程段

"数据段"  存放的是全局变量、常数以及动态数据分配的数据空间(如malloc函数取得的空间)等。
"正文段"  存放的是程序中的代码
"堆栈段"      存放的是函数的返回地址、函数的参数以及程序中的局部变量

进程分类

1.交互进程

该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运    行。该类进程经常与用户进行交互,需要等待用户的输入,当接收到用户的输入后,该类    进程会立刻响应,典型的交互式进程有:shell命令进程、文本编辑器等

2.批处理进程

该类进程不属于某个终端,它被提交到一个队列中以便顺序执行

3.守护进程

该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束

进程状态

1.运行态R:
指正在被CPU运行或者就绪的状态。这样的进程被成为running进程。
2.睡眠态:
可中断睡眠态S:处于等待状态中的进程,一旦被该进程等待的资源被释放,那么该进程就会进入运行状态。
(只能通过特定的函数进行唤醒,是不能随便去中断的)
不可中断睡眠态D:该状态的进程只能用wake_up()函数唤醒。
3.暂停态T:
当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。
4.死亡态X进程结束
5.僵尸态Z: 当进程已经终止运行,但还占用系统资源,要避免僵尸态的产生

进程状态切换图

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

就绪状态

当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

执行状态

当进程已获得处理机(CPU),其程序正在处理机上执行,此时的进程状态称为执行状态。

阻塞状态

正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SMS流媒体服务器-MPEG-PS流的深度解析

1.简介 ps流的解析&#xff0c;只要按照标准文档对照16进制的流数据&#xff0c;基本都能看的明白。但是实际项目中会碰到各种各样的问题。本文将对如何高效的解析出音视频数据发表一下个人的看法。 介绍一下本人的开源流媒体&#xff0c;点个star&#xff0c;有兴趣一起开发的…

应急响应:勒索病毒-实战 案例一.【Windows 系统-排查和解密】

什么是勒索病毒. 勒索病毒是一种恶意软件&#xff0c;它通过加密用户的数据或锁定用户设备&#xff0c;然后要求用户支付赎金以解锁数据或系统。勒索病毒的入侵方式多样&#xff0c;包括网络共享文件、捆绑传播、垃圾邮件、水坑攻击、软件供应链传播、暴力破解、利用已知漏洞攻…

javaweb_08:Mybatis入门(基于Springboot)

javaweb_08&#xff1a;Mybatis入门 一、引入二、快速入门&#xff08;一&#xff09;准备工作1、创建Springboot工程2、创建user数据库3、创建实体类 &#xff08;二&#xff09;引入MyBatis相关依赖&#xff0c;配置MyBatis。&#xff08;三&#xff09;编写SQL语句&#xff…

动态路由OSPF基础学习笔记一

由于静态路由由网络管理员手工配置&#xff0c;因此当网络发生变化时&#xff0c;静态路由需要手动调整&#xff0c;这制约了静态路由在现网大规模的应用。 动态路由协议因其灵活性高、可靠性好、易于扩展等特点被广泛应用于现网。在动态路由协议之中&#xff0c;OSPF&#xf…

Linux I/O 多路复用机制详解

文章目录 1 文件描述符&#xff08;File Descriptor&#xff09;1.1 什么是文件描述符&#xff1f;1.2 文件描述符与文件的关系 2 文件描述符集合&#xff08;File Descriptor Set&#xff09;2.1 什么是文件描述符集合&#xff1f;2.2 fd_set 结构体 3 select() 函数的工作原理…

ros笔记06--从零体验ros2中launch系统

ros笔记06--从零体验ros2中launch系统 介绍创建步骤最基础的 launch 案例多节点 launch 案例 注意事项说明 介绍 ROS2系统通常由许多节点组成&#xff0c;这些节点运行在许多不同的进程(甚至不同的机器)上。虽然可以通过 ros2 run 单独运行这些节点&#xff0c;但当节点数量很…

【LLM入门】Let‘s reproduce GPT-2 (124M)【完结,重新回顾一下,伟大!】

文章目录 03:43:05 SECTION 4: results in the morning! GPT-2, GPT-3 repro03:56:21 shoutout to llm.c, equivalent but faster code in raw C/CUDA【太牛了ba】03:59:39 summary, phew, build-nanogpt github repo 03:43:05 SECTION 4: results in the morning! GPT-2, GPT-…

计算机毕业设计选题推荐-springboot 基于springboot的宠物健康顾问系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Windows系统下Go安装与使用

step1&#xff1a; 下载go语言SDK 下载地址&#xff1a;https://go.dev/dl/ 下载后选择合适位置安装即可&#xff0c;我选择D盘 在安装完成后&#xff0c;可以通过go env 命令检测是否安装成功。在“命令提示符”界面输入“go env”命令&#xff0c;如果显示如下类似结果则说明…

C++STL初阶(12):stack和queue的初阶实现

1. stack的选型 对于栈的实现是我们非常熟悉的过程&#xff1a; C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客 _top表示下标&#xff0c;_capacity表示空间大小&#xff1a; 那么按照我们原来的思路&#xff0c;利用_top和_capacity T*来给stack构形。 temp…

Grok 2携AI图片生成重生

埃隆马斯克&#xff08;Elon Musk&#xff09;的人工智能初创公司xAI推出其最新的AI助手Grok 2的测试版&#xff0c;添加了类似于OpenAI的DALL-E和Google的Gemini的图像生成工具&#xff0c;但对可以生成的图像类型的限制显然较少。<这是其中的一个“亮点”&#xff0c;一些…

【Hot100】LeetCode—234. 回文链表

目录 1- 思路快慢指针链表拆分反转链表 2- 实现⭐234. 回文链表——题解思路 3- ACM 实现 原题连接&#xff1a;234. 回文链表 1- 思路 快慢指针链表拆分反转链表 思路 ①将链表拆分前后两个部分——>找拆分点、②反转后面部分、③根据反转结果&#xff0c;同时利用两个指…

揭秘住宅IP代理:原理、用途及应用分析

在数字化时代&#xff0c;互联网已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着网络环境日益复杂&#xff0c;隐私保护、网络访问限制等问题愈发凸显。住宅IP代理作为一种新兴的网络技术解决方案&#xff0c;正逐渐成为众多跨境业务和网络活动的重要工具。…

打卡第46天------动态规划(回文串)

想要快点把每一道题给练会,在面试的时候跟面试官对答如流,这家公司实在是让我没有继续待下去的欲望了,天天祈祷上Di,求Shang帝帮助我实现两份工作的无缝衔接。交托仰望。 今天 我们就要结束动态规划章节了,动态规划的题目还是挺难的,贪心和动态规划对我来说都比较困难,对…

Jeecgboot3.6.3的vue3版本的一种flowable动态增加一个用户任务节点的方法(三)后端代码实现

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 这部分主要讲后端实现部分 1、增加一个AddTaskVo 类型,提供新增任务需要的数据结构 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.D…

10结构型设计模式——桥接模式

一、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是结构型的设计模式之一。桥接模式基于类的最小设计原则&#xff0c;通过使用封装&#xff0c;聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象&#xff08;abstraction&#xff09;与行为实…

PNG的存储方式[计算机原理]

块的基本理论 众所周知&#xff0c;所有的信息在计算机中以位的形式存在&#xff08;0|1&#xff09;8位是一个字节&#xff0c;可以表示成两个16进制数&#xff0c;例如0xFC因为4位对应一个16进制数嘛。PNG这种图片也不例外&#xff0c;它也是由位组成的&#xff0c;不过我们…

利用Redis获取权限的多种方式

更多实战内容&#xff0c;可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/10333.html Redis是我们在实战中经常接触到的一款数据库&#xff0c;因其在前期打点中被利用后可直接影响服务器安全所以在攻防过程中也备受红队关注&#xff0c;在本文中会重点分享一…

【java】Java Cryptography Extension (JCE)

在Java中&#xff0c;我们可以使用Java Cryptography Extension (JCE) 来实现加密和解密工具和技术。以下是一些常见的加密和解密技术及其示例代码&#xff1a; 1.使用AES加密和解密 package org.example.Test05;import javax.crypto.Cipher; import javax.crypto.spec.Secre…

高效记录与笔记整理的策略:工具选择、结构设计与复习方法

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…