1.vscode的下載
這里放一篇大佬超詳細(xì)解析的博客,包括解決下載速度慢的問(wèn)題
vscode下載博客
2. vscode的使用
1. 連接遠(yuǎn)端
vscode是一個(gè)編輯器
winodows +linux 聯(lián)合開(kāi)發(fā) ,用vscode取代vim
將本地將vscode打造開(kāi)發(fā)環(huán)境 – vscode的本地環(huán)境搭建
紅框中填入 linux主機(jī)名字

輸入 ssh 用戶名+ 主機(jī)名
將ssh 用戶名和IP地址 更新到 本地的哪一個(gè)配置文件中

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

IP地址處 按右鍵,在新窗口連接 即新創(chuàng)建一個(gè)終端
選擇Linux平臺(tái)
然后在白框中輸入用戶名 對(duì)應(yīng)的密碼

在新創(chuàng)建的終端上,點(diǎn)擊電腦圖標(biāo),SSH出現(xiàn)綠色的對(duì)號(hào)即表示連接成功
2. 在vscode創(chuàng)建文件并運(yùn)行程序

打開(kāi)文件夾即可打開(kāi)在Linux下自己用戶的家目錄

需要注意的是當(dāng)打開(kāi)文件后,還需再次輸入密碼
創(chuàng)建一個(gè)新文件,并命名為test.c ,此時(shí)出現(xiàn)一個(gè)黑點(diǎn),說(shuō)明本地代碼并沒(méi)有同步給遠(yuǎn)端

在xshell上,打開(kāi)對(duì)應(yīng)新創(chuàng)建的test.c 什么都都沒(méi)有
輸入 CTRL S 后,黑點(diǎn)就消失了,對(duì)應(yīng)就保留到遠(yuǎn)端中了
切換到命令行

輸入 CTRL ~ 即可 打出在Linux內(nèi)部?jī)?nèi)置的命令行

可以在vscode上運(yùn)行可執(zhí)行程序
3. 安裝常見(jiàn)插件
一定是要先連接IP地址,否則直接下載就會(huì)下到本地
C/C++
C/C++Extension Pack——c/c++擴(kuò)展包
c/c++Themes 在vscode上設(shè)置主題
Chinese 將英文轉(zhuǎn)換為簡(jiǎn)體中文
vscode-icons 改變編輯器里面的文件圖標(biāo)
filesize 左下角顯示源文件大小的插件
Include AutoComplete 自動(dòng)頭文件包含
GBKtoUTF8 自動(dòng)將GBK轉(zhuǎn)換為UTF8
3. 進(jìn)程間通信
管道的進(jìn)程具有獨(dú)立性的
一個(gè)進(jìn)程掛掉,不影響另一個(gè)進(jìn)程, 可會(huì)增加通信的成本
要讓兩個(gè)不同的進(jìn)程進(jìn)行通信,前提條件是:先讓兩個(gè)進(jìn)程看到同一份 資源
在操作系統(tǒng)內(nèi)創(chuàng)建一份公共的資源,既不屬于進(jìn)程A,又不屬于進(jìn)程B,進(jìn)程A能看到資源,進(jìn)程B也能看到資源
把進(jìn)程A生產(chǎn)的數(shù)據(jù)放入 資源中 ,進(jìn)程B就可以拿到數(shù)據(jù)放入自己的上下文中
1. 簡(jiǎn)單舉例
who
查看當(dāng)前用戶哪一個(gè)處于登錄狀態(tài)
wc
統(tǒng)計(jì)文本行有多少行的命令who | wc -l
統(tǒng)計(jì)當(dāng)前正在登錄用戶的個(gè)數(shù)

who進(jìn)程 以寫方式打開(kāi)文件
wc -l 進(jìn)程 以讀方式 打開(kāi)文件
who進(jìn)程將自己的標(biāo)準(zhǔn)輸出重定向到管道中
wc -l 進(jìn)程將自己的標(biāo)準(zhǔn)輸入重定向到管道中
2.管道原理
每一個(gè)進(jìn)程被創(chuàng)建時(shí)都有自己的文件描述符表
1. 新創(chuàng)建的文件被打開(kāi)時(shí),有自己的緩沖區(qū),它是由操作系統(tǒng)提供的純純的內(nèi)存文件,不需要將自己的內(nèi)容刷新到磁盤中 , 以讀方式和寫方式分別打開(kāi)同一個(gè)文件
2. 當(dāng)前進(jìn)程進(jìn)行一次fork
操作系統(tǒng)會(huì)為子進(jìn)程創(chuàng)建PCB結(jié)構(gòu),操作系統(tǒng)也會(huì)把文件描述符表拷貝給子進(jìn)程
父進(jìn)程打開(kāi)的文件內(nèi)容不需要再次拷貝給子進(jìn)程
因?yàn)槭莿?chuàng)建子進(jìn)程,是需要把進(jìn)程相關(guān)的內(nèi)核數(shù)據(jù)結(jié)構(gòu)拷貝就可以了,右側(cè)屬于文件系統(tǒng),屬于操作系統(tǒng)在內(nèi)存中打開(kāi)的文件
文件描述表中保存的是文件的地址,所以依舊會(huì)指向父進(jìn)程所對(duì)應(yīng)的文件
管道只支持單向通信
確定數(shù)據(jù)流向,關(guān)閉關(guān)閉不需要的fd
若想要子進(jìn)程進(jìn)行寫入,父進(jìn)程進(jìn)行讀取,關(guān)閉子進(jìn)程對(duì)應(yīng)的讀端,以及父進(jìn)程的寫端
此時(shí)就可以正常通信了
為什么把讀寫都打開(kāi),只打開(kāi)讀或者寫不可以嗎?
若只打開(kāi)讀方式打開(kāi),則被子進(jìn)程繼承下去后依舊是只能以讀方式打開(kāi),無(wú)法進(jìn)行數(shù)據(jù)交互的
3. 通過(guò)父子進(jìn)程理解管道
在vscode中 點(diǎn)擊新建文件夾,即可創(chuàng)建目錄 pipe
在目錄pipe上 點(diǎn)擊右鍵 新建文件 ,即可 生成 pipe.cc(cc結(jié)尾代表cpp) 的文件
1. 創(chuàng)建匿名管道

pipe 作用是 創(chuàng)建一個(gè)無(wú)名管道
pipe函數(shù) 參數(shù)是兩個(gè)元素的數(shù)組
參數(shù)作為輸出型參數(shù)

要一次獲得該管道文件的讀和寫,對(duì)應(yīng)的是兩個(gè)文件描述符,需要將兩個(gè)文件描述符的數(shù)字返回
pipe的參數(shù)是一個(gè)數(shù)組,實(shí)際上傳入的是數(shù)組首元素的地址
若返回值小于0,則通過(guò)errno(出錯(cuò)碼)來(lái)得到出錯(cuò)結(jié)果
strerror 將錯(cuò)誤碼轉(zhuǎn)換成錯(cuò)誤碼描述的

最終發(fā)現(xiàn)打印出來(lái)的結(jié)果 為 3 與 4 ,正好對(duì)應(yīng) 數(shù)組中下標(biāo) 3與4的位置
系統(tǒng)調(diào)用為什么可以使用c語(yǔ)言的errno
正常來(lái)說(shuō),是調(diào)用c語(yǔ)言接口出錯(cuò)了,才調(diào)用的errno 或者 strerror的
為什么調(diào)用系統(tǒng)調(diào)用接口時(shí),也會(huì)使用 errno來(lái)說(shuō)明錯(cuò)誤的原因
系統(tǒng)調(diào)用接口是由系統(tǒng)使用c語(yǔ)言的一套軟件
2.創(chuàng)建子進(jìn)程以及通信

關(guān)閉不需要的fd,讓父進(jìn)程進(jìn)行讀取,讓子進(jìn)程進(jìn)行寫入
一般認(rèn)為pipefd[0] 為讀端 , pipefd[1]為寫端
用close來(lái)關(guān)閉文件描述符
所以關(guān)閉子進(jìn)程的讀端 ,關(guān)閉父進(jìn)程的寫端
將子進(jìn)程變化的數(shù)據(jù)導(dǎo)給父進(jìn)程
把namestr 字符串內(nèi)容與 計(jì)數(shù)器 cnt 以及pid值 構(gòu)建成一個(gè)字符串 打包給 父進(jìn)程
使用snprintf函數(shù) 將amestr 字符串內(nèi)容與 計(jì)數(shù)器 cnt 以及pid值寫入buffer中,并規(guī)定傳入buffer大小
c_str():返回const char*類型的指針
ssize_t write(int fd, const void *buf, size_t count);
fd代表文件描述符
buf代表 緩沖區(qū)
count代表 緩沖區(qū)大小
使用write 將緩沖區(qū)的count大小的數(shù)據(jù)寫入 fd中
將buffer中的所有數(shù)據(jù)都傳入讀端中
3. 父進(jìn)程讀取消息
使用write 將緩沖區(qū)的count大小的數(shù)據(jù)寫入 fd中
ssize_t read(int fd, void *buf, size_t count);
從文件描述符fd中將我們想要的數(shù)據(jù),按照數(shù)據(jù)塊的方式讀取出來(lái)
返回值代表多少字節(jié),讀取到文件結(jié)尾為0,失敗為-1
read讀取時(shí)并不會(huì)把buffer當(dāng)作一個(gè)字符串,而我們要把buffer看作是一個(gè)字符串,所以要預(yù)留出\0的位置
即 sizeof(buffer)-1
將讀端讀取到buffer字符串的內(nèi)容
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.創(chuàng)建管道
int n=pipe(pipefd);
//返回值為0 則成功
if(n<0)//說(shuō)明出錯(cuò)
{
cout<<"pipe error,"<<errno<<": "<<strerror(errno)<<endl;
return 1;
}
//返回0和1里面的文件描述符
cout<<"pipefd[0]: "<<pipefd[0]<<endl;
cout<<"pipefd[1]: "<<pipefd[1]<<endl;
//2.創(chuàng)建子進(jìn)程
pid_t id=fork();
assert(id!=-1);//返回-1,說(shuō)明創(chuàng)建子進(jìn)程失敗
if(id==0)
{
//子進(jìn)程
//讓父進(jìn)程進(jìn)行讀取,讓子進(jìn)程進(jìn)行寫入
close(pipefd[0]);//關(guān)閉子進(jìn)程的讀端
//開(kāi)始通信
const string namestr="hello,我是子進(jìn)程";
int cnt=1;
char buffer[1024];
while(true)
{
snprintf(buffer,sizeof(buffer),"%s:計(jì)數(shù)器,PID:%d\n",namestr.c_str(),cnt++,getpid());
write(pipefd[1],buffer,strlen(buffer));
}
close(pipefd[1]);//當(dāng)子進(jìn)程用完,就關(guān)閉
exit(0);//退出
}
//父進(jìn)程
//關(guān)閉不需要的fd (文件描述符)
close(pipefd[1]);//關(guān)閉父進(jìn)程的寫端
//4.開(kāi)始通信
char buffer[1024];
while(true)
{
int n=read(pipefd[0],buffer,sizeof(buffer)-1);
if(n>0)//讀取成功
{
buffer[n]='\0';
//由子進(jìn)程傳過(guò)來(lái)的消息
cout<<"我是父進(jìn)程:child send give message:"<<buffer<<endl;
}
}
close(pipefd[0]);//關(guān)閉父進(jìn)程的讀端
return 0;
}
4. 管道特點(diǎn)
1.單向通信
2.管道本質(zhì)是文件,因?yàn)閒d的聲明周期隨進(jìn)程,管道的生命周期隨進(jìn)程的
3.管道通信 ,通常用來(lái)進(jìn)行具有血緣關(guān)系的進(jìn)程,來(lái)進(jìn)行進(jìn)程通信的,常用于父子通信
pipe打開(kāi)管道,并不清楚管道的名字,被稱為匿名管道
4.管道面向字節(jié)流(對(duì)寫入和讀取的次數(shù)無(wú)關(guān))
5.具有一定的協(xié)同能力,讓讀端和寫端能夠按照一定的步驟進(jìn)行通信
(若寫端寫滿了,就需要等待讀端讀好才能繼續(xù)寫
當(dāng)讀端把管道的數(shù)據(jù)讀完后,如果寫端不發(fā)數(shù)據(jù),讀端只能等待)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-430851.html
5. 場(chǎng)景
1. 如果我們r(jià)ead讀取完畢了所有的管道數(shù)據(jù),如果對(duì)方不發(fā),就只能等待
2. 如果寫端將管道寫滿了,就不能再寫了
3.若關(guān)閉寫端,讀取完畢管道數(shù)據(jù),再讀,就會(huì)read返回0,表明讀到了文件結(jié)尾
4.寫端一直寫,讀端關(guān)閉,沒(méi)有意義操作系統(tǒng)不會(huì)維護(hù)無(wú)意義,低效率,或者浪費(fèi)資源的事情,操作系統(tǒng)會(huì)通過(guò)信號(hào)來(lái)終止進(jìn)程(13 SIGPIPE)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-430851.html
到了這里,關(guān)于【Linux】vscode的使用 | 進(jìn)程間通信(簡(jiǎn)單概括)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!