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

这篇具有很好参考价值的文章主要介绍了【Linux】vscode的使用 | 进程间通信(简单概括)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.vscode的下载

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

2. vscode的使用

1. 连接远端

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


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

红框中填入 linux主机名字


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

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


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

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


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

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


【Linux】vscode的使用 | 进程间通信(简单概括)
选择Linux平台
然后在白框中输入用户名 对应的密码


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

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

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

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

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


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

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


【Linux】vscode的使用 | 进程间通信(简单概括)
创建一个新文件,并命名为test.c ,此时出现一个黑点,说明本地代码并没有同步给远端


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

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


【Linux】vscode的使用 | 进程间通信(简单概括)
输入 CTRL S 后,黑点就消失了,对应就保留到远端中了

切换到命令行

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

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


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

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

3. 安装常见插件

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

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


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

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


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

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


Chinese 将英文转换为简体中文
【Linux】vscode的使用 | 进程间通信(简单概括)


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

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


filesize 左下角显示源文件大小的插件
【Linux】vscode的使用 | 进程间通信(简单概括)


Include AutoComplete 自动头文件包含

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


GBKtoUTF8 自动将GBK转换为UTF8

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

3. 进程间通信

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

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

1. 简单举例

who
查看当前用户哪一个处于登录状态
【Linux】vscode的使用 | 进程间通信(简单概括)


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

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


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

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

2.管道原理

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

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

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

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

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


【Linux】vscode的使用 | 进程间通信(简单概括)
管道只支持单向通信
确定数据流向,关闭关闭不需要的fd
若想要子进程进行写入,父进程进行读取,关闭子进程对应的读端,以及父进程的写端
此时就可以正常通信了

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

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

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

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

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


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

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

1. 创建匿名管道

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

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


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

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


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

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


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

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

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

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

2.创建子进程以及通信

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

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


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

把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. 父进程读取消息

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

使用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)
文章来源地址https://www.toymoban.com/news/detail-430851.html

到了这里,关于【Linux】vscode的使用 | 进程间通信(简单概括)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程通信之管道通信详解

    🍎 作者: 阿润菜菜 📖 专栏: Linux系统编程 其实管道通信是Unix中最古老的进程间通信的形式了: 管道通信是一种进程间通信的方式,它可以让一个进程的输出作为另一个进程的输入,实现数据的传输、资源的共享、事件的通知和进程的控制。 管道通信分为两种类型:匿名

    2023年04月19日
    浏览(41)
  • Linux--进程间的通信--进程池

    进程间的通信–匿名管道 进程池是一种将多个进程组织起来以执行特定任务的机制 。 它由多个预先创建好的资源进程和一个管理进程组成。这些资源进程被管理进程负责分配和调度,用于处理任务 。 当有新的任务提交时,管理进程会从进程池中取出一个资源进程,将任务

    2024年04月25日
    浏览(36)
  • Linux多进程(二)进程通信方式一 管道

    管道的是进程间通信(IPC - InterProcess Communication)的一种方式,管道的本质其实就是内核中的一块内存(或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接对其进行任何操作。 因为管道数据是通过队列来维护的,我们先

    2024年04月29日
    浏览(35)
  • 【Linux】Linux进程间通信(三)

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】Linux进程概念 管道通信本质是基于文件的,也就是说操作系统并没有为此做过多的设计工作,而system V IPC是操作系统特

    2024年02月05日
    浏览(33)
  • 【Linux C | 进程】Linux 进程间通信的10种方式(2)

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍 🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭 本文未经允许,不得转发!!! POSIX消息队列与

    2024年02月20日
    浏览(33)
  • 【Linux C | 进程】Linux 进程间通信的10种方式(1)

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍 🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭 本文未经允许,不得转发!!! 下表是进程间通

    2024年01月25日
    浏览(36)
  • Linux——进程间通信&&管道

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 数据传输:一个进程需要把他的数据传给另外一个进程。 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组

    2024年04月09日
    浏览(44)
  • Linux——进程间通信(管道)

    目录 进程通信的目的 管道 见见猪跑(举个例子) 文件描述符fd与管道的关系(深度理解管道) 什么是管道?  匿名管道 pipe函数概述 父子进程通信时与文件描述符的关系图(理解pipe函数的关键) pipe函数的使用  管道读写规则 管道的大小 自测  使用man 7 pipe查看 使用ulimit -a查看 管

    2024年02月03日
    浏览(88)
  • 【Linux】进程通信 — 共享内存

    上一章我们由进程通信,引入并讲述了管道,匿名管道和命名管道和匿名管道。本章我们将继续讲解进程通信的另一种方式,通过共享内存的方式来进行进程间的通信。还要学习几个系统调用接口,并用代码实现两个进程通过共享内存来进行通信。目标已经确定,接下来就要

    2024年02月15日
    浏览(43)
  • Linux进程通信——共享内存

    两个进程的PCB创建虚拟地址空间然后映射到物理内存中,每个进程因为是独立的,所以在物理内存中的地址也不同。 那么共享内存是怎么做到的呢? 首先先在物理内存中申请一块内存。 然后讲这块内存通过页表映射分别映射到这两个进程的虚拟地址空间内,让这两个进程都

    2024年02月01日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包