IO进程线程(五)库的制作、进程

文章目录

  • 一、库
    • (一)静态库
      • 1. 概念
      • 2. 制作
      • 3. 使用(编译)
        • (1)生成可执行文件
        • (2)运行
    • (二)动态库(共享库)
      • 1. 概念
      • 2. 制作
      • 3. 生成可执行文件
      • 4. 基于动态库的可执行文件的执行过程
  • 二、进程
    • (一)概念
      • 1. 进程
      • 2. 进程和程序的区别
      • 3. 进程的组成
      • 4. 进程的种类
        • (1)交互进程
        • (2)批处理进程
        • (3)守护进程
      • 5. 特殊PID的进程
    • (二)相关命令
      • 1. ps 命令
      • 2. top和htop命令
      • 3. pidof命令
      • 4.kill命令--给进程发信号的

一、库

库就是一个二进制文件,是将.c文件编译生成的二进制文件,
里面存放的就是函数实现的二进制的机器指令,库又分为静态库和动态库。

windows:
静态库: xxx.lib
动态库: xxx.dll
linux:
静态库: libxxx.a
动态库: libxxx.so

(一)静态库

1. 概念

静态库是以 libxxx.a 格式命名的 lib 是前缀 .a 是后缀 xxx 是库名
如果在编译时使用的是静态库,会将静态库中的机器指令编译到可执行文件中,
可执行文件的体积相对较大,执行效率相对较高。
静态库更新操作比较麻烦,需要重新编译生成可执行文件,否则拿不到新的库里的指令

2. 制作

#首先,生成.o文件
gcc  -c  xxx1.c  -o  xxx1.o
gcc  -c  xxx2.c  -o  xxx2.o
....

#ar -cr 目标文件 依赖文件
ar  -cr  libxxx.a  xxx1.o  xxx2.o  ....   

3. 使用(编译)

(1)生成可执行文件

gcc 参数

-I  指定头文件的路径
-L  指定库文件的路径
-l  (小写的L)指定链接哪个库

在这里插入图片描述

(2)运行

无需指定库文件路径

(二)动态库(共享库)

1. 概念

动态库又叫共享库,是以 libxxx.so 命名的 lib 是前缀 .so 是后缀 xxx 是库名
如果在编译时使用的是动态库,只会将动态库中的函数符号表编译到可执行文件中,
可执行文件的体积相对较小,执行时需要去动态库中找到对应的机器指令执行,效率相对较低。
动态库更新操作非常方便,只需要替换库即可,执行时自动就执行了新的库里的指令

2. 制作

gcc  -c  -fPIC  xxx1.c  -o  xxx1.o  #-fPIC表示忽略相对位置
gcc  -c  -fPIC  xxx2.c  -o  xxx2.o
...
gcc  -shared  xxx1.o   xxx2.o  ...  -o  libxxx.so #这种更常用 

或者可以直接把.c编译成动态库

gcc  -fPIC  -shared  xxx1.c  xxx2.c  -o  libxxx.so 

3. 生成可执行文件

与静态库类似

-I  指定头文件的路径
-L  指定库文件的路径
-l  (小写的L)指定链接哪个库

4. 基于动态库的可执行文件的执行过程

如果直接执行,会报错 找不到库文件。

运行前需要指定库的路径,指定库的路径可以用下面的方式:

方式1(相对更常用):通过修改环境变量来实现----最常用的方式,必须会用
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:新的库的路径
//如果相对整个用户生效 可以把上面的指令放在 ~/.bashrc

方式2:可以把自己的库放在系统默认的库的路径中----需要sudo权限
sudo cp libxxx.so /lib
或者
sudo cp libxxx.so /usr/lib

方式3:可以通过修改系统的配置文件来实现----需要sudo权限
sudo vi /etc/ld.so.conf.d/libc.conf
在后面添加自己的库文件的路径即可
保存退出后 使用 sudo ldconfig 重新加载配置

将数据结构的相关函数封装为静态库


二、进程

(一)概念

1. 进程

程序的一次执行过程就会产生一个进程。

进程是分配资源的最小单位(0-3G)。

进程就是一个正在执行的任务。
进程是一个动态的过程,它有生命周期:随着程序的运行开始,随着程序结束而消亡。

每个进程都有自己的独立的运行的空间,比如
每个进程都有自己的文件描述符,每个进程都拥有自己的缓冲区。
只要用户执行了一个程序,在内核空间就会创建一个task_struct结构体,这个结构体就代表当前的进程。
进程运行产生的所有的信息都被放到这个结构体中保存着。

2. 进程和程序的区别

程序:程序是经过编译器编译生成的二进制文件,程序在硬盘上存储。
程序是静态的,没有生命周期的概念,程序本身不会分配内存。

进程:程序的一次执行过程就会创建一个进程,进程是动态的,有生命周期。
进程运行的时候会分配0-3G的内存空间。进程在内存上存储。

3. 进程的组成

进程是由三个部分组成的:进程的PCB(task_struct),(程序段)文本段,数据段。

4. 进程的种类

(1)交互进程

这种进程维护一个终端,通过这个终端用户可以和进程进程交互。例如:文本编辑器

(2)批处理进程

这种进程优先级比较低,运行的时候会被放到一个运行的队列中。
随着队列的执行,而逐渐执行。
例如gcc编译程序的时候这个进程就是批处理进程。

(3)守护进程

守护进程就是后台运行的服务,随着系统的启动而启动,随着系统的终止而终止。
例如:windows上的各种服务

PID就是操作系统给进程分配的编号,它是识别进程的唯一的标识。
在linux系统中PID是一个大于等于0的值。
在linux系统中创建的进程的个数是有限制的(通过如下命令查看)。
cat /proc/sys/kernel/pid_max
4194304

5. 特殊PID的进程

0:idle:在linux系统启动的时候运行的第一个进程就是0号进程。
如果没有其他的进程执行就运行这个idle进程。
1:init:1号进程是由0号进程调用内核kernel_thread函数产生的第一个进程,
它会初始化所有的系统的硬件。当初始化完之后会一直执行,比如会为孤儿进程回收资源。
2:kthreadd:调度器进程,主要负责进程的调度工作。

(二)相关命令

1. ps 命令

linux@ubuntu:~$  ps -ef //用来查看进程的pid和ppid
        UID          PID    PPID  C STIME TTY          TIME CMD
        root           1       0  0 529 ?       00:00:18 /sbin/init auto noprompt
        root           2       0  0 529 ?       00:00:00 [kthreadd]
        root           3       2  0 529 ?       00:00:00 [rcu_gp]
    //UID   所属用的id
    //PID   进程id
    //PPID  父进程的PID
    //C    CPU占用率
    //STIME  进程启动的时间
    //TTY  是由否与之关联的终端 如果? 就表示没有
    //TIME  进程占用CPU的时间
    //CMD  运行进程的命令

linux@ubuntu:~$  ps -ajx  //用来查看进程状态
       PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
          0       1       1       1 ?             -1 Ss       0   0:18 /sbin/init auto nopr
          0       2       0       0 ?             -1 S        0   0:00 [kthreadd]
          2       3       0       0 ?             -1 I<       0   0:00 [rcu_gp]
    //PGID  进程组id
    //SID   会话id
    //打开一个终端就会产生一个新的会话
    	//一个会话中可以有多个进程组 其中 前台进程组只有一个 后台进程组可以有多个
    	//每个进程组中又可以有多个进程
    //TPGID  如果是-1 就表示是守护进程
    //STAT   进程的状态

2. top和htop命令

  • 注:htop命令需要自己安装sudo apt-get install htop
top和htop命令
    //动态的查看系统中进程的情况
进程号 USER   PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND         
91769 linux     20   0    2364    576    512 R  99.7   0.0   8:21.70 a.out           
 1704 linux     20   0 4894516 895980  59164 S   6.0  22.6  29:18.19 gnome-shell     
 1539 linux     20   0  319112  50656  18724 S   3.3   1.3  10:35.31 Xorg  

3. pidof命令

pidof a.out //查看系统中所有名为a.out的进程PID

4.kill命令–给进程发信号的

kill -l //查看系统中的信号
在这里插入图片描述

kill  -2  pid  //给进程发一个终止信号 (ctrl+c) 发出的信号
kill  -9  pid  //杀死一个进程
kill  -19 pid  //停止(暂停)一个进程 
kill  -18 pid  //让停止的进程继续运行
killall a.out //杀死所有能操作的名为a.out的进程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9. MySQL事务、字符集

文章目录 【 1. 事务 Transaction 】1.1 事务的基本原理1.2 MySQL 执行事务的语法和流程1.2.1 开始事务1.2.2 提交事务1.2.3 回滚&#xff08;撤销&#xff09;事务实例1&#xff1a;一致性实例2&#xff1a;原子性 【 2. 字符集 和 校对规则 】2.1 基本原理2.2 查看字符集查看…

Web3.0区块链技术开发方案丨NFT项目开发

在Web3.0时代&#xff0c;非同质化代币&#xff08;NFT&#xff09;的概念正在引领着数字资产领域的变革和创新。NFT作为区块链上的数字资产&#xff0c;具有独一无二的特性&#xff0c;可以代表任何形式的数字或实物资产&#xff0c;并在区块链上进行唯一标识和交易。本文将探…

ElementUI中date-picker组件,怎么给选择一个月份范围中大写月份改为阿拉伯数组月份(例如:一月、二月,改为1月、2月)

要将 Element UI 的 <el-date-picker> 组件中的月份名称从中文大写&#xff08;如 "一月", "二月"&#xff09;更改为阿拉伯数字&#xff08;如 "1月", "2月"&#xff09;&#xff0c;需要进行一些定制化处理。可以通过国际化&a…

php项目加密源码

软件简介 压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹&#xff08;子文件夹里的php文件也会被加密&#xff09;&#xff0c;加密后的压缩包需要先修复一下&#xff0c;步骤&#xff1a;打开压缩包 》 工具 》 修…

如何找出你的Windows 10的内部版本和版本号?这里提供两种方法

你过去可能没有真正考虑过Windows内部版本号,除非这是你工作的一部分。以下是如何了解你运行的Windows 10的内部版本、版本和版本号。 内部版本意味着什么 Windows一直使用内部版本。它们代表着对Windows的重大更新。传统上,大多数人都是根据他们使用的主要命名版本(Windo…

Docker大学生看了都会系列(二、2.2CentOS安装Docker)

系列文章目录 第一章 Docker介绍 第二章 2.1 Mac通过Homebrew安装Docker 第二章 2.2 CentOS安装Docker 第三章 Docker常用命令 文章目录 一、前言二、环境三、CentOS安装Docker3.1 系统要求3.2 卸载旧的版本3.3 安装yum工具包3.4 设置Docker的镜像源3.5 安装Docker3.6 关闭防火…

新手教程之使用LLaMa-Factory微调LLaMa3

文章目录 为什么要用LLaMa-Factory什么是LLaMa-FactoryLLaMa-Factory环境搭建微调LLaMA3参考博文 为什么要用LLaMa-Factory 如果你尝试过微调大模型&#xff0c;你就会知道&#xff0c;大模型的环境配置是非常繁琐的&#xff0c;需要安装大量的第三方库和依赖&#xff0c;甚至…

滤波算法[2]----理解离散贝叶斯滤波器(上)

离散过滤器(Discrete Filter) 为了方便对离散贝叶斯过滤器的理解&#xff0c;开始使用了下面的一个例子&#xff0c;十分形象生动的阐述了离散贝叶斯的原理&#xff0c;以及实现过程。 虽然我本篇博客的目的不是为了直接对书进行翻译&#xff0c;但是这个例子很妙&#xff0c;…

WebStorm 2024.1.1 Mac激活码 前端开发工具集成开发环境(IDE)

WebStorm 2024 Mac激活码 搜索Mac软件之家下载WebStorm 2024 Mac激活版 WebStorm 2024 功能介绍 WebStorm 2024是由JetBrains公司开发的一款专为前端开发设计的集成开发环境&#xff08;IDE&#xff09;。它提供了一整套功能&#xff0c;旨在提高Web开发者的工作效率和代码质…

Nextjs使用教程

一.手动创建项目 建议看这个中文网站文档,这个里面的案例配置都是手动的,也可以往下看我这个博客一步步操作 1.在目录下执行下面命令,初始化package.json文件 npm init -y2.安装react相关包以及next包 yarn add next react react-dom // 或者 npm install --save next react…

特步公主与七匹狼公子举行婚礼:“校服是你,婚纱也是你”!95后“二代”们开始接班?

从校服到婚纱&#xff0c;两位福建晋江系企业的“二代”上演了一出豪门青梅竹马的网络小说情节。 6月1日是个有意思的日子&#xff0c;有人庆祝儿童节&#xff0c;有人举办婚礼。 当天晚上&#xff0c;特步集团“小公主”丁佳敏在其社交媒体平台官宣了喜讯&#xff0c;并且晒…

重磅消息! Stable Diffusion 3将于6月12日开源 2B 版本的模型,文中附候补注册链接。

在OpenAI发布Sora后&#xff0c;Stability AI也发布了其最新的模型Stabled Diffusion3, 之前的文章中已经和大家介绍过&#xff0c;感兴趣的小伙伴可以点击以下链接阅读。Sora是音视频方向&#xff0c;Stabled Diffusion3是图像生成方向&#xff0c;那么两者没有必然的联系&…

Nginx在线部署和离线部署方式

Nginx 有两种安装方式: 1)在线安装的方式 1.添加Nginx 到yum源 sudo rpm -Uvh <http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm> 2.安装Nginx,直接使用yum方式 yum install -y nginx 3.启动nginx,刚安装的nginx不…

AI程序员来了,大批码农要失业

根据GitHub发布的《Octoverse 2021年度报告》&#xff0c;2021年中国有755万程序员&#xff0c;排名全球第二。 ChatGPT的出现&#xff0c;堪比在全球互联网行业点燃了一枚“核弹”&#xff0c;很多人都会担心“自己的工作会不会被AI取代”。 而2024年的AI进展速度如火箭般&am…

搭建chattts应用,做文字转语音

下载代码 git clone https://github.com/2noise/ChatTTS.git下载endpoint并上传&#xff1a; https://huggingface.co/2Noise/ChatTTS/tree/main 将上面下载的文件上传到服务器上 修改webui.py 更改为本地模型地址 import os import random import argparseimport torch i…

Java常规题技术分享

一、数组排序和添加成员 设计类Student和类StudentClass。 (1) 类Student有字符串属性name、double属性grade和int属性age 有带参数的构造方法&#xff0c;可设置三个属性的值 有各个属性的置取方法 (2)类StudentClass有Student数组属性stus存放班级成员&#xff0c;有int…

【ARM Cache 与 MMU 系列文章 7.6 -- ARMv8 MMU 相关寄存器介绍】

文章目录 MMU 转换控制寄存器 TCR_ELxTCR_ELx 概览TCR_ELx 寄存器字段详解TCR 使用示例Normal MemoryCacheableShareability MMU 内存属性寄存器 MAIR_ELx寄存器结构内存属性字段使用实例 MMU 地址翻译表基址寄存器 TTBR0/1_ELxTTBR0_ELx 寄存器概述寄存器结构功能和用途编程示…

【C++修行之道】类和对象(四)运算符重载

目录 一、 运算符重载 函数重载和运算符重载有什么关系&#xff1f; 二、.*运算符的作用 三、运算符重载的正常使用 四、重载成成员函数 五、赋值运算符重载 1.赋值运算符重载格式 传值返回和引用返回 有没有办法不生成拷贝&#xff1f; 2. 赋值运算符只能重载成类的…

思维导图-vb.net开发带进度条的复制文件夹功能c#复制文件夹

你们谁写代码会用流程图来做计划&#xff0c;或者写项目总结报告&#xff1f; .net带进度条复制文件夹 方案 列出所有子文件夹&#xff0c;再创建&#xff0c;复制文件 大文件可以单独做进度条 缺点&#xff1a;设计会更复杂 直接…

让你的博客实现负载均衡

零、缘起 有时候博客突然挂了&#xff0c;发现服务器厂商出了问题&#xff0c;很忧伤&#xff0c;我正在写着或查阅自家博客那种不可xx的内容。这时想着&#xff0c;如果这个博客有负载均衡就好了&#xff0c;空了想着实现下。 一分钟了解负载均衡的一切 选择第二种【反向代…