【Linux】vscode的使用 | 进程间通信(简单概括)

news2025/1/19 8:24:46

文章目录

  • 1.vscode的下载
  • 2. vscode的使用
    • 1. 连接远端
    • 2. 在vscode创建文件并运行程序
      • 切换到命令行
    • 3. 安装常见插件
  • 3. 进程间通信
    • 1. 简单举例
    • 2.管道原理
      • 为什么把读写都打开,只打开读或者写不可以吗?
    • 3. 通过父子进程理解管道
      • 1. 创建匿名管道
        • 系统调用为什么可以使用c语言的errno
      • 2.创建子进程以及通信
      • 3. 父进程读取消息
      • 4. 完整代码
    • 4. 管道特点
    • 5. 场景

1.vscode的下载

这里放一篇大佬超详细解析的博客,包括解决下载速度慢的问题
vscode下载博客

2. vscode的使用

1. 连接远端

vscode是一个编辑器
winodows +linux 联合开发 ,用vscode取代vim
将本地将vscode打造开发环境 – vscode的本地环境搭建


在这里插入图片描述

红框中填入 linux主机名字


输入 ssh 用户名+ 主机名
将ssh 用户名和IP地址 更新到 本地的哪一个配置文件中


再次重启vscode,在SSH箭头下就有了IP地址存在


IP地址处 按右键,在新窗口连接 即新创建一个终端


在这里插入图片描述
选择Linux平台
然后在白框中输入用户名 对应的密码


在新创建的终端上,点击电脑图标,SSH出现绿色的对号即表示连接成功

2. 在vscode创建文件并运行程序

打开文件夹即可打开在Linux下自己用户的家目录


需要注意的是当打开文件后,还需再次输入密码


在这里插入图片描述
创建一个新文件,并命名为test.c ,此时出现一个黑点,说明本地代码并没有同步给远端


在xshell上,打开对应新创建的test.c 什么都都没有


在这里插入图片描述
输入 CTRL S 后,黑点就消失了,对应就保留到远端中了

切换到命令行

输入 CTRL ~ 即可 打出在Linux内部内置的命令行


可以在vscode上运行可执行程序

3. 安装常见插件

一定是要先连接IP地址,否则直接下载就会下到本地

C/C++
在这里插入图片描述


C/C++Extension Pack——c/c++扩展包

在这里插入图片描述


c/c++Themes 在vscode上设置主题

在这里插入图片描述


Chinese 将英文转换为简体中文
在这里插入图片描述


vscode-icons 改变编辑器里面的文件图标

在这里插入图片描述


filesize 左下角显示源文件大小的插件
在这里插入图片描述


Include AutoComplete 自动头文件包含

在这里插入图片描述


GBKtoUTF8 自动将GBK转换为UTF8

在这里插入图片描述

3. 进程间通信

管道的进程具有独立性的
一个进程挂掉,不影响另一个进程, 可会增加通信的成本

要让两个不同的进程进行通信,前提条件是:先让两个进程看到同一份 资源
在操作系统内创建一份公共的资源,既不属于进程A,又不属于进程B,进程A能看到资源,进程B也能看到资源
把进程A生产的数据放入 资源中 ,进程B就可以拿到数据放入自己的上下文中

1. 简单举例

who
查看当前用户哪一个处于登录状态
在这里插入图片描述


wc 统计文本行有多少行的命令
who | wc -l 统计当前正在登录用户的个数

在这里插入图片描述


who进程 以写方式打开文件
wc -l 进程 以读方式 打开文件
who进程将自己的标准输出重定向到管道中
wc -l 进程将自己的标准输入重定向到管道中

2.管道原理

在这里插入图片描述

每一个进程被创建时都有自己的文件描述符表

1. 新创建的文件被打开时,有自己的缓冲区,它是由操作系统提供的纯纯的内存文件,不需要将自己的内容刷新到磁盘中 , 以读方式和写方式分别打开同一个文件

2. 当前进程进行一次fork
操作系统会为子进程创建PCB结构,操作系统也会把文件描述符表拷贝给子进程
父进程打开的文件内容不需要再次拷贝给子进程
因为是创建子进程,是需要把进程相关的内核数据结构拷贝就可以了,右侧属于文件系统,属于操作系统在内存中打开的文件

文件描述表中保存的是文件的地址,所以依旧会指向父进程所对应的文件


在这里插入图片描述
管道只支持单向通信
确定数据流向,关闭关闭不需要的fd
若想要子进程进行写入,父进程进行读取,关闭子进程对应的读端,以及父进程的写端
此时就可以正常通信了

为什么把读写都打开,只打开读或者写不可以吗?

若只打开读方式打开,则被子进程继承下去后依旧是只能以读方式打开,无法进行数据交互的

3. 通过父子进程理解管道

在这里插入图片描述

在vscode中 点击新建文件夹,即可创建目录 pipe


在这里插入图片描述

在目录pipe上 点击右键 新建文件 ,即可 生成 pipe.cc(cc结尾代表cpp) 的文件

1. 创建匿名管道

pipe 作用是 创建一个无名管道
pipe函数 参数是两个元素的数组
参数作为输出型参数


要一次获得该管道文件的读和写,对应的是两个文件描述符,需要将两个文件描述符的数字返回


在这里插入图片描述

pipe的参数是一个数组,实际上传入的是数组首元素的地址
若返回值小于0,则通过errno(出错码)来得到出错结果
strerror 将错误码转换成错误码描述的


最终发现打印出来的结果 为 3 与 4 ,正好对应 数组中下标 3与4的位置

系统调用为什么可以使用c语言的errno

正常来说,是调用c语言接口出错了,才调用的errno 或者 strerror的
为什么调用系统调用接口时,也会使用 errno来说明错误的原因
系统调用接口是由系统使用c语言的一套软件

2.创建子进程以及通信

关闭不需要的fd,让父进程进行读取,让子进程进行写入
一般认为pipefd[0] 为读端 , pipefd[1]为写端
用close来关闭文件描述符
所以关闭子进程的读端 ,关闭父进程的写端
将子进程变化的数据导给父进程


在这里插入图片描述

把namestr 字符串内容与 计数器 cnt 以及pid值 构建成一个字符串 打包给 父进程

使用snprintf函数 将amestr 字符串内容与 计数器 cnt 以及pid值写入buffer中,并规定传入buffer大小
c_str():返回const char*类型的指针


ssize_t write(int fd, const void *buf, size_t count);
fd代表文件描述符
buf代表 缓冲区
count代表 缓冲区大小
使用write 将缓冲区的count大小的数据写入 fd中

将buffer中的所有数据都传入读端中

3. 父进程读取消息

在这里插入图片描述

使用write 将缓冲区的count大小的数据写入 fd中
ssize_t read(int fd, void *buf, size_t count);
从文件描述符fd中将我们想要的数据,按照数据块的方式读取出来

返回值代表多少字节,读取到文件结尾为0,失败为-1
read读取时并不会把buffer当作一个字符串,而我们要把buffer看作是一个字符串,所以要预留出\0的位置
即 sizeof(buffer)-1
将读端读取到buffer字符串的内容

4. 完整代码

#include<iostream>
#include<cerrno>//C++提供
#include<unistd.h>
#include<string.h>
#include<cassert>
#include<string>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int main()
{
    int pipefd[2]={0};
    //1.创建管道
   int n=pipe(pipefd);
   //返回值为0 则成功
   if(n<0)//说明出错
   {
     cout<<"pipe error,"<<errno<<": "<<strerror(errno)<<endl;
     return 1;
   }
   //返回0和1里面的文件描述符
   cout<<"pipefd[0]: "<<pipefd[0]<<endl;
   cout<<"pipefd[1]: "<<pipefd[1]<<endl;
    
    //2.创建子进程
     pid_t id=fork();
     assert(id!=-1);//返回-1,说明创建子进程失败
     if(id==0)
     {
        //子进程
        //让父进程进行读取,让子进程进行写入
        close(pipefd[0]);//关闭子进程的读端

        //开始通信
       const  string namestr="hello,我是子进程";
       int cnt=1;
       char buffer[1024];
        while(true)
        {
          snprintf(buffer,sizeof(buffer),"%s:计数器,PID:%d\n",namestr.c_str(),cnt++,getpid());
          write(pipefd[1],buffer,strlen(buffer));
        }

         
        close(pipefd[1]);//当子进程用完,就关闭      
        exit(0);//退出

     }
     
    //父进程


    //关闭不需要的fd (文件描述符)
    close(pipefd[1]);//关闭父进程的写端
    
    

    //4.开始通信
    char buffer[1024];
    while(true)
    {
     int n=read(pipefd[0],buffer,sizeof(buffer)-1);
     if(n>0)//读取成功
     {
           buffer[n]='\0';
           //由子进程传过来的消息
           cout<<"我是父进程:child send give message:"<<buffer<<endl;
     }

    }
      close(pipefd[0]);//关闭父进程的读端
   return 0;
}

4. 管道特点

1.单向通信
2.管道本质是文件,因为fd的声明周期随进程,管道的生命周期随进程的
3.管道通信 ,通常用来进行具有血缘关系的进程,来进行进程通信的,常用于父子通信
pipe打开管道,并不清楚管道的名字,被称为匿名管道
4.管道面向字节流(对写入和读取的次数无关)
5.具有一定的协同能力,让读端和写端能够按照一定的步骤进行通信
(若写端写满了,就需要等待读端读好才能继续写
当读端把管道的数据读完后,如果写端不发数据,读端只能等待)

5. 场景

1. 如果我们read读取完毕了所有的管道数据,如果对方不发,就只能等待
2. 如果写端将管道写满了,就不能再写了
3.若关闭写端,读取完毕管道数据,再读,就会read返回0,表明读到了文件结尾
4.写端一直写,读端关闭,没有意义操作系统不会维护无意义,低效率,或者浪费资源的事情,操作系统会通过信号来终止进程(13 SIGPIPE)

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

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

相关文章

不用996,不用007,赚的还比我多?我直接好家伙

今天打开手机就看见信息99&#xff0c;哟吼&#xff0c;还挺热闹——感情都在上班摸鱼呢。 好奇心让我点了第一条未读信息&#xff0c;好家伙&#xff0c;直接让我手机闪退出APP了&#xff01; 嗨&#xff0c;我这暴脾气&#xff0c;直接手动滑到了第一条&#xff01;但是我没…

CentOS7-部署Tomcat并运行Jpress

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。1、简述静态网页和动态网页的区别 静态网页&#xff1a; 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进…

009:Mapbox GL点击click某位置,显示坐标信息

第009个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中点击某位置,显示坐标信息 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共81行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:htt…

一行代码就能完成的事情,为什么要写两行?

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 三元运算符 用三元运算符代替简单的if else if (age < 18) {me 小姐姐; } else {me …

MIMO-OFDM无线通信技术(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本代码为MIMO-OFDM无线通信技术及MATLAB实现。分为十章&#xff0c;供大家学习。 &#x1f4da;2 运行结果 主函数部分代码&a…

移动端架构师都需要具备怎样的技术栈和能力

移动端架构师都需要具备怎样的技术栈和能力 主要的能力 技术深度 技术广度 动手能力: 比如说造轮子的能力, UI(高级自定义UI, 通用UI组件库), LibrarySDK(通用基础库, 项目框架/架构) 经验丰富 辅助的能力 领导力 沟通能力 洞察与前瞻 赋能业务 技术栈 T字形技术栈语言语言高…

TPS79650DCQR低压差线性稳压器、TPS54040ADGQR一款42V,0.5A降压稳压器数据手册资料

TPS79650DCQR低压差&#xff08;LDO&#xff09;低功耗线性稳压器具有高电源抑制比&#xff08;PSRR&#xff09;、超低噪声、快速启动&#xff0c;以及出色的线路和负载瞬态响应&#xff0c;采用小外形、33 VSON、SOT223-6和TO-263封装。该系列的每个器件在输出端都有一个小型…

14届蓝桥杯Python总结

在比赛的时候大家头脑注意力都高度集中&#xff0c;比较紧绷&#xff0c; 我是不喜欢太紧绷的神经的&#xff0c;这时候电脑就夸得一下关机重启了&#xff0c;我当时真的想说关的好&#xff0c;休息一会&#xff08;哈哈哈&#xff09; 重启后我就继续做题&#xff0c;虽然出了…

AcWing 第一讲 打卡例题习题题目

AcWing 第一讲 打卡&例题&习题题目 1. AcWing 1. A B #include<iostream>using namespace std;int main(){int a,b;cin >> a >> b;cout << ab << endl;return 0; }2. AcWing 608. 差 #include<iostream>using namespace std;int…

他98年的,我真的玩不过他...

现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…

ChatGPT做爬虫的第一步

做爬虫就是搞数据, 专业的人做专业的事, ChatGPT阅虫无数, 搞个小爬虫, So Easy! 我知道可以百度到下载图片的代码, 但是我不想百度了, 一切交给ChatGPT 你只需要问他: 怎么用Nodejs下载图片? 其中&#xff0c;url是图片的地址&#xff0c;filePath是保存图片的本地路径。使…

安装stable-diffusion时遇到卡的情况

安装过程中&#xff0c;假如出现Installing gfpgan并且卡了很久不动&#xff0c;见下图&#xff1a; 遇到这个情况&#xff0c;怎么解决呢&#xff1f; 去TencentARC/GFPGAN官网&#xff0c;点击绿色的“Code”按钮&#xff0c;然后点击“Download ZIP”按钮&#xff1a; 将下…

MySQL--数据类型--0409

目录 1.数值类型 1.2 tinyint类型 2.bit类型 3.小数类型 3.1 float 3.2 decimal 4.字符类型 4.1 char 4.2 varchar 4.3 char 和 varchar 比较 5. 日期类型 6. enum 和 set 6.2 set和enum的查找 6.2.1 enum的查找 6.2.2 set的查找 1.数值类型 1.2 tinyint类型 只…

IDE装上ChatGPT,一天开发一个系统

昨天白天在写代码&#xff0c;晚上看了一场直播&#xff0c;是两个技术的直播&#xff1a; 一个是技术总监&#xff0c;一个是号称Java之父的余**。 结果Java之父被技术总监吊打。然后匆匆下播。 技术这玩意&#xff0c;真的就是真的&#xff01; 白天我开发了一个系统&…

二叉搜索树的oj

目录 一、根据二叉树创建字符串 二、二叉树的层序遍历 三、二叉树的层序遍历Ⅱ 四、二叉树的最近公共祖先 ①递归求解 ②回溯求解 五、二叉搜索树和双向链表 六、根据一棵树的前序遍历与中序遍历构造二叉树 七、从中序与后序遍历序列构造二叉树 八、二叉树的任一遍历…

大厂面试-算法优化:冒泡排序你会优化吗?

关注公众号&#xff1a;”奇叔码技术“ 回复&#xff1a;“java面试题大全”或者“java面试题” 即可领取资料 原文&#xff1a;冒泡排序及优化代码 https://blog.csdn.net/weixin_43989347/article/details/122025689原文&#xff1a;十大经典排序算法 https://frxcat.fun/pa…

矩阵相似题型总结

矩阵相似题型总结 &#xff08;一&#xff09;题型一&#xff1a;判断含重特征值的方阵A能否相似对角化&#xff08;即能否相似于对角阵&#xff09; 所有特征值均不同的矩阵必可相似对角化&#xff0c;含重特征值的矩阵呢&#xff1f;可如下做 &#xff08;1&#xff09;求A的…

C++linux高并发服务器项目实践 day4

Clinux高并发服务器项目实践 day4模拟实现ls -l指令文件属性操作函数access函数chmod 与chowntruncate函数目录操作函数mkdir和rmdirrenamechdir和getcwd目录遍历函数dup、dup2函数dupdup2fcntl函数模拟实现ls -l指令 #include<sys/types.h> #include<sys/stat.h>…

为何巴菲特和马斯克站在了一起?

股神巴菲特虽然非常传奇&#xff0c;但是马斯克对其并不感冒。马斯克曾经在一档电视节目中表示&#xff0c;实业才是王道&#xff0c;埋怨金融业抢走太多人才和精英&#xff0c;暗指巴菲特为年轻人做了错误示范。当然&#xff0c;巴菲特的投资非常厉害&#xff0c;但也有失手的…

2-修改example适用于不同开发板

1.问题 手上只有基于nRF52811芯片的BMD360开发板,与pca10056e开发板同一个芯片.所以pca10056e的example都可以适用于BMD360开发板,只需要修改开发板相同的输入输出硬件管脚即可.因为BMD360开发板与pca10056e开发板的输入输出管脚不同. 而BMD360开发板输入输出管脚于PCA10040相同…