进程通信1

软硬链接:
区别:有无inode
动态库和静态库
静态库 .a
将 .o文件打包成 lib_.a文件

  • 1、站在制作库工程师角度
  • 2、站在使用者角度使用动态库

建立动态库:

[LHL@VM-8-7-centos lesson24]$ vim mymath.c
[LHL@VM-8-7-centos lesson24]$ gcc -fPIC -c mymath.c -o mymath.o
[LHL@VM-8-7-centos lesson24]$ gcc -fPIC -c myprint.c -o myprint.o
[LHL@VM-8-7-centos lesson24]$ readlf -S mymath.o
-bash: readlf: command not found
[LHL@VM-8-7-centos lesson24]$ readIf -S mymath.o
-bash: readIf: command not found
[LHL@VM-8-7-centos lesson24]$ readelf -S mymath.o
There are 11 section headers, starting at offset 0x238:Section Headers:[Nr] Name              Type             Address           OffsetSize              EntSize          Flags  Link  Info  Align[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .text             PROGBITS         0000000000000000  000000400000000000000030  0000000000000000  AX       0     0     1[ 2] .data             PROGBITS         0000000000000000  000000700000000000000000  0000000000000000  WA       0     0     1[ 3] .bss              NOBITS           0000000000000000  000000700000000000000000  0000000000000000  WA       0     0     1[ 4] .comment          PROGBITS         0000000000000000  00000070000000000000002e  0000000000000001  MS       0     0     1[ 5] .note.GNU-stack   PROGBITS         0000000000000000  0000009e0000000000000000  0000000000000000           0     0     1[ 6] .eh_frame         PROGBITS         0000000000000000  000000a00000000000000038  0000000000000000   A       0     0     8[ 7] .rela.eh_frame    RELA             0000000000000000  000001c80000000000000018  0000000000000018   I       8     6     8[ 8] .symtab           SYMTAB           0000000000000000  000000d800000000000000d8  0000000000000018           9     8     8[ 9] .strtab           STRTAB           0000000000000000  000001b00000000000000016  0000000000000000           0     0     1[10] .shstrtab         STRTAB           0000000000000000  000001e00000000000000054  0000000000000000           0     0     1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),l (large), p (processor specific)
[LHL@VM-8-7-centos lesson24]$ gcc -shared myprint.o mymath.o -o libhello.so
[LHL@VM-8-7-centos lesson24]$ ll
total 36
-rwxrwxr-x 1 LHL LHL 8152 Mar 19 10:11 libhello.so
-rw-rw-r-- 1 LHL LHL  330 Mar 19 09:45 Makefile
-rw-rw-r-- 1 LHL LHL  172 Mar 19 10:01 mymath.c
-rw-rw-r-- 1 LHL LHL   75 Mar 19 09:46 mymath.h
-rw-rw-r-- 1 LHL LHL 1272 Mar 19 10:01 mymath.o
-rw-rw-r-- 1 LHL LHL  100 Mar 19 09:46 myprint.c
-rw-rw-r-- 1 LHL LHL   88 Mar 19 09:47 myprint.h
-rw-rw-r-- 1 LHL LHL 1624 Mar 19 10:01 myprint.o
[LHL@VM-8-7-centos lesson24]$ 

[LHL@VM-8-7-centos lesson24]$ gcc -fPIC -c mymath.c -o mymath.o
[LHL@VM-8-7-centos lesson24]$ gcc -fPIC -c myprint.c -o myprint.o
[LHL@VM-8-7-centos lesson24]$ gcc -shared myprint.o mymath.o -o libhello.so

编写进makefile 文件:

[LHL@VM-8-7-centos makelib]$ make clean
rm -rf *.o *.a *.so output  
[LHL@VM-8-7-centos makelib]$ make 
gcc -c -fPIC mymath.c -o mymath_d.o
gcc -c -fPIC myprint.c -o myprint_d.o
gcc -shared  mymath_d.o myprint_d.o -o libhello.so 
gcc -c mymath.c -o mymath.o
gcc -c myprint.c -o myprint.o
ar -rc libhello.a mymath.o myprint.o
[LHL@VM-8-7-centos makelib]$ ll
total 52
drwxrwxr-x 4 LHL LHL 4096 Mar 19 10:36 hello
-rw-rw-r-- 1 LHL LHL 3066 Mar 19 11:25 libhello.a
-rwxrwxr-x 1 LHL LHL 8152 Mar 19 11:25 libhello.so
-rw-rw-r-- 1 LHL LHL  607 Mar 19 10:41 Makefile
-rw-rw-r-- 1 LHL LHL  172 Mar 19 10:01 mymath.c
-rw-rw-r-- 1 LHL LHL 1272 Mar 19 11:25 mymath_d.o
-rw-rw-r-- 1 LHL LHL   75 Mar 19 09:46 mymath.h
-rw-rw-r-- 1 LHL LHL 1272 Mar 19 11:25 mymath.o
-rw-rw-r-- 1 LHL LHL  100 Mar 19 09:46 myprint.c
-rw-rw-r-- 1 LHL LHL 1624 Mar 19 11:25 myprint_d.o
-rw-rw-r-- 1 LHL LHL   88 Mar 19 09:47 myprint.h
-rw-rw-r-- 1 LHL LHL 1576 Mar 19 11:25 myprint.o
[LHL@VM-8-7-centos makelib]$ make out[ut
make: *** No rule to make target `out[ut'.  Stop.
[LHL@VM-8-7-centos makelib]$ make output
mkdir -p output/lib
mkdir -p output/include
cp -rf *.h output/include
cp -rf *.a output/lib
cp -rf *.so output/lib
[LHL@VM-8-7-centos makelib]$ tree hello/
hello/
|-- include
|   |-- mymath.h
|   `-- myprint.h
`-- lib|-- libhello.a`-- libhello.so2 directories, 4 files
[LHL@VM-8-7-centos makelib]$ 

至此,已经完成代码的打包。

将output包移动或安装到指定的执行路径中。

打包安装包

[LHL@VM-8-7-centos makelib]$ mv output ../uselib
[LHL@VM-8-7-centos makelib]$ cd ..//打包安装包
[LHL@VM-8-7-centos uselib]$ tar czf mylib.tgz output
[LHL@VM-8-7-centos uselib]$ ll
total 12
-rw-rw-r-- 1 LHL LHL  164 Mar 19 11:11 main.c
-rw-rw-r-- 1 LHL LHL 3100 Mar 19 11:37 mylib.tgz
drwxrwxr-x 4 LHL LHL 4096 Mar 19 11:32 output
[LHL@VM-8-7-centos uselib]$ //需要指明头文件位置
[LHL@VM-8-7-centos uselib]$ gcc main.c
main.c:1:21: fatal error: myprint.h: No such file or directory#include "myprint.h"^
compilation terminated.
[LHL@VM-8-7-centos uselib]$ gcc main.c -I output/include[LHL@VM-8-7-centos uselib]$ gcc main.c -I output/include -L output/lib -lhello
[LHL@VM-8-7-centos uselib]$ tree
.
|-- a.out
|-- main.c
|-- mylib.tgz
`-- output|-- include|   |-- mymath.h|   `-- myprint.h`-- lib|-- libhello.a`-- libhello.so3 directories, 7 files
[LHL@VM-8-7-centos uselib]$ 

[LHL@VM-8-7-centos uselib]$ gcc main.c -I output/include -L output/lib -lhello
动静库名字相同 默认情况下连接的是动态库

gcc main.c -I output/include -L output/lib -lhello -static
如果动态库存在,指定静态库

[LHL@VM-8-7-centos uselib]$ gcc main.c -I output/include -L output/lib -lhello -static
[LHL@VM-8-7-centos uselib]$ ll
total 856
-rwxrwxr-x 1 LHL LHL 861344 Mar 19 11:55 a.out
-rw-rw-r-- 1 LHL LHL    164 Mar 19 11:11 main.c
-rw-rw-r-- 1 LHL LHL   3100 Mar 19 11:37 mylib.tgz
drwxrwxr-x 4 LHL LHL   4096 Mar 19 11:32 output
[LHL@VM-8-7-centos uselib]$ ./a.out
hello world[1710820537]
res: 5050
[LHL@VM-8-7-centos uselib]$ 

为什么要有库???
站在使用库的角度 库的存在可以大大减少我们开发的周期 提高软件的本身的质量。
站在写库人的角度:简单 代码安全
1、 ncurses 字符的界面库 -----centos 7 yum
2、boost 标准准库 里面的好玩的功能

GDB 配置更改没证 没找着地方

进程间通信

进程运行具有独立性:进程间想通信难度较大。
进程间通信的本质:先让不同的进程看到同一份资源(内存空间)。
为什么要进行进程间通信?数据传输、资源共享、通知事件、进程控制。

管道

管道是unix中最古老的进程间通信的形式。
我们把从一个进程连接到另一个进程的一个数据流称为一个管道。
管道特点:只能单向通信。

进程间通信的技术背景:
1、进程是具有独立性的。虚拟地址空间+页表 保证进程运行的独立性(进程内核数据结构+进程的代码和数据结构)
2、进程成本比较高。

进程间通信的本质理解

  • 1、进程间通信的前提,首先需要让不同的进程看到同一块“内存”。
  • 2、同一块内存不属于任何一个进程而是共享。

进程间通信的标准:

  • LInux原生能提供——管道
  • systemV ——多进程——单机通信 :共享内存、消息队列、信号量
  • posix——多线程——网络通信

管道:

  1. 分别以读写方式打开同一个问题
  2. fork()创建子进程
  3. 双方进程各自关闭自己不需要的文件描述符。

管道特点:

  1. 管道是
  2. 具有通过让进程
  3. 面向字节流
  4. 基于文件
  5. 单向通信

3、扩展

进程间通信:先让不同的进程看到同一份资源!
mkfifo namepipe 指定路径内创建管道
unlink name_pipe 删除

[LHL@VM-8-7-centos lesson26]$ mkfifo name_pipe
[LHL@VM-8-7-centos lesson26]$ ll
total 0
prw-rw-r-- 1 LHL LHL 0 Mar 22 09:30 name_pipe
[LHL@VM-8-7-centos lesson26]$ echo "hello word" > name_pipe
-bash: name_pipe: Interrupted system call
[LHL@VM-8-7-centos lesson26]$ echo "hello word" > name_pipe
[LHL@VM-8-7-centos lesson26]$ 
[LHL@VM-8-7-centos lesson26]$ while :; do echo "hello word" ; sleep 1 ; done > name_pipe[LHL@VM-8-7-centos lesson26]$ cat < name_pipe 
hello word[LHL@VM-8-7-centos lesson26]$ unlink name_pipe
[LHL@VM-8-7-centos lesson26]$ ll
total 0
[LHL@VM-8-7-centos lesson26]$ make
g++ -o client client.cc -std=c++11
g++ -o server server.cc -std=c++11
[LHL@VM-8-7-centos lesson26]$ ll
total 52
-rwxrwxr-x 1 LHL LHL 14376 Mar 22 11:28 client
-rw-rw-r-- 1 LHL LHL   422 Mar 22 10:59 client.cc
-rw-rw-r-- 1 LHL LHL   315 Mar 22 11:28 comm.hpp
-rw-rw-r-- 1 LHL LHL   409 Mar 22 11:27 Log.hpp
-rw-rw-r-- 1 LHL LHL   156 Mar 22 09:49 Makefile
-rwxrwxr-x 1 LHL LHL 14504 Mar 22 11:28 server
-rw-rw-r-- 1 LHL LHL  1224 Mar 22 11:27 server.cc
[LHL@VM-8-7-centos lesson26]$ ./server| 1711078131 | Debug | 创建管道文件成功step 1| 1711078139 | Debug | 打开管道文件成功step 2
client say>nihao
client say>chileimw
client say>丁酮
client say>好吧
read end of file,clien quit,server quit too!| 1711078243 | Debug | 关闭管道文件成功step 3| 1711078243 | Debug | 删除管道文件成功step 4
[LHL@VM-8-7-centos lesson26]$ [LHL@VM-8-7-centos lesson26]$ ./client
Please Enter Message Line :> nihao
Please Enter Message Line :> chileimw
Please Enter Message Line :> 丁酮
Please Enter Message Line :> 好吧
Please Enter Message Line :> ^C
[LHL@VM-8-7-centos lesson26]$ 

共享内存的建立:
共享内存提供者是操作系统。
操作系统要不要管理共享内存?

用户空间:不用经过系统调用,可以直接访问! 双方进程如果要通信,直接进行内存级的读和写。

信号量

  1. 多个进程看到的一份资源——临界资源
  2. 进程访问临界资源的代码——临界区
  3. 只有一个进程进入临界区——互斥

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

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

相关文章

安卓腾讯桌球多功能助手直装版

安卓13自测效果&#xff0c;安卓12-安卓12以下一定可以的&#xff0c;QQ登陆的话扫码登陆&#xff0c;两个手机&#xff0c;一个扫码&#xff0c;一个游戏&#xff0c;一个手机的话&#xff0c;你可以下载个虚拟机&#xff0c;然后本机直装&#xff0c;用虚拟机QQ扫码即可 微信…

Web3D技术应用在什么场景,能给企业带来什么价值?

Web3D现在已经在很多行业和领域应用了&#xff0c;以 博维数孪 行业用户为例&#xff0c;它能够为企业带来一系列价值&#xff1a; 1、电商领域&#xff1a;在电商中&#xff0c;Web3D技术可以提供3D商品展示&#xff0c;让消费者能够全面了解商品的每一个细节&#xff0c;并且…

react 的条件渲染

##### 使用 if/else 语句 可以在 JSX 中使用普通的 JavaScript if/else 语句来进行条件渲染。 import React from react; function ConditionalRender(props) {const isLoggedIn props.isLoggedIn;if (isLoggedIn) {return <UserGreeting />;} else {return <Guest…

基于与STM32的加湿器之雾化片驱动

基于与STM32的加湿器之雾化片驱动 加湿器是一种由电力驱动&#xff0c;用于增加环境湿度的家用电器。加湿器通过特定的方式&#xff08;如蒸发、超声波振动或加热&#xff09;将水转化为水蒸气&#xff0c;并将这些水蒸气释放到空气中&#xff0c;从而增加空气中的湿度。主要功…

算法训练 | 图论Part5 | 107. 寻找存在的路径

目录 107. 寻找存在的路径 并查集法 107. 寻找存在的路径 题目链接&#xff1a;107. 寻找存在的路径 文章讲解&#xff1a;代码随想录 并查集法 代码一&#xff1a;并查集 #include <iostream> #include <vector> using namespace std;int n; // 节点数量 v…

中医四大经典之 No.1

且行且行 ID&#xff1a;九日尧三石 2024710 菜菜狗不知第几篇小笔记 四大经典之《内经》 1. 素问*痿论 治痿独取阳明&#xff0c;其次&#xff0c;冲脉、带脉、督脉也可。 2. 素问*汤液醪醴论 神不使&#xff1a;精神涣散、神机丧失 去宛&#xff08;瘀血&#xf…

中职网络安全wire0077数据包分析

从靶机服务器的FTP上下载wire0077.pcap&#xff0c;分析该文件&#xff0c;找出黑客入侵使用的协议&#xff0c;提交协议名称 SMTP 分析该文件&#xff0c;找出黑客入侵获取的zip压缩包&#xff0c;提交压缩包文件名 DESKTOP-M1JC4XX_2020_09_24_22_43_12.zip 分析该文件&…

移动互联安全扩展要求测评项

安全物理环境-无线接入点的位置选择 应为无线接入设备的安装选择合理位置&#xff0c;避免过度覆盖和电磁干扰。 无线接入设备的安装位置选择不当&#xff0c;易被攻击者利用&#xff0c;特别是攻击者会通过无线信号过度覆盖的弱点进行无线渗透攻击&#xff0c;因此要选择合理…

利用 Selenium 自动化抓取 Web of Science 论文数据:以 IEEE SENSORS JOURNAL 为例

在当今数字化时代,科研工作者面临着海量学术信息的挑战。有效地收集、筛选和分析相关领域的最新研究成果,对于保持科研竞争力至关重要。然而,手动检索和整理学术文献不仅耗时耗力,还容易出现疏漏。为了解决这一问题,我们可以借助自动化工具来提高文献检索的效率和准确性。…

JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据 存储和读取数据的解决方案 内存中数据不能永久化存储 程序停止运行 数据消失 File只能对文件本身进行操作 不能读写文件里存储的数据 读写数据必须要有IO流 可以把程序中的数据保存到文件当中 还可以把本地文件中的数据读取到数据当中 分…

计算机未来大方向

选专业要了解自己的兴趣所在。 即想要学习什么样的专业&#xff0c;如果有明确的专业意向&#xff0c;就可以有针对性地选择那些专业实力较强的院校。 2.如果没有明确的专业意向&#xff0c;可以优先考虑一下院校。 确定一下自己想要选择综合性院校还是理工类院校或是像财经或者…

闭眼投!IF逐年上涨,国人录用率超高,无预警风险,平均8周录用!

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • CCF推荐&#xff0c;4.5-5.0&#xff08;2天见刊&#xff09; • 生物医学制药类&#xff08;2天逢投必中&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09…

Linux--网络设置

目录 一、测试网络连接 1、查看网络接口信息 1.1 ifconfig 命令---查看网络接口信息 1.1.1 ifconfig 网卡 #单独查看某个网卡 1.1.2 ifconfig -a #显示所有活动及非活动的连接 二、修改网络配置文件 三、设置网络接口参数 3.1 启用、禁用网络接口配置 3.2 hostn…

电脑故障排除

一、硬件故障 1. 电源问题 故障表现&#xff1a;电脑无法开机&#xff0c;电源指示灯不亮。 解决方法&#xff1a;首先检查电源线是否插紧&#xff0c;电源插座是否有电。如果问题没有解决&#xff0c;可能是因为电源已经损坏&#xff0c;应该购买并安装一个新的电源。 2. …

C++ 先排序后查找。

先排序后查找。 #include <stdio.h> #include <string.h> #define N 100 typedef struct Stu {char name[20];int score; } STU;void Input(STU stu[], int n); void SelectiveMethod(STU stu[], int n); void Print(STU stu[], int n); int BinarySearch(STU stu[…

Lianwei 安全周报|2024.07.09

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 《数字中国发展报告&#xff08;2023年&#xff09…

设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)

写在前面&#xff1a;本文是个人在学习设计模式时的所思所想&#xff0c;汇总了其他博主及自己的感悟思考&#xff0c;可能存在出入&#xff0c;请大家理性食用~~ 工厂模式 在工厂模式中&#xff0c;父类决定实例的生成方式&#xff0c;但并不决定所要生成的具体的类&#xf…

[终端安全]-7 后量子密码算法

本文参考资料来源&#xff1a;NSA Releases Future Quantum-Resistant (QR) Algorithm Requirements for National Security Systems > National Security Agency/Central Security Service > Article Commercial National Security Algorithm Suite 2.0” (CNSA 2.0) C…

领域驱动设计DDD

为什么要DDD 传统MVC 传统的MVC模型框架拆分成了三层&#xff1a;显示层、控制层、模型层。显示层负责显示用户界面&#xff0c;控制层负责处理业务逻辑、而模型则负责与数据库通信&#xff0c;对数据进行持久化的操作。从代码角度来看&#xff0c;这样的框架结构每个模块职责…

自从Transformer模型诞生之后,新的深度学习模型有哪些?

自从Transformer模型诞生之后&#xff0c;新的深度学习模型有哪些&#xff1f; 自2017年Transformer模型问世以来&#xff0c;它彻底改变了自然语言处理&#xff08;NLP&#xff09;领域的范式。Transformers不仅在许多NLP任务中达到了前所未有的性能&#xff0c;还被广泛应用…