背景知识
管道可用于进程间通信。
- 从管道一端写入数据(write,文件描述符为 1)),数据在管道中流动,可从另外一端被读取(read, 文件描述符为 0)。
- 数据读取或写入的时候,另一端的管道会被 关闭 。
- fork()之后,子进程的pid为0,父进程的pid为原来的,两者互不干扰。
代码
#include "kernel/types.h"
#include "user/user.h"
int main(int argc,char *argv[]){
int p1[2];
int p2[2];
int pid;
char buf[1];
pipe(p1);
pipe(p2);
pid=fork();
if(pid<0) exit(1);
else if(pid==0){
close(p1[1]);
close(p2[0]);
read(p1[0],buf,1);
printf("%d: received ping\n",getpid());
write(p2[1]," ",1);
close(p1[0]);
close(p2[1]);
}else{
close(p1[0]);
close(p2[1]);
write(p1[1]," ",1);
read(p2[0],buf,1);
printf("%d: received pong\n",getpid());
close(p1[1]);
close(p2[0]);
}
exit(0);
}
一点额外收获(vim相关)
其实这个实验本身是easy程度,不过因为比较头铁,想要直接在vim里面写代码,所以在折腾它的过程中学到了很多vim操作。
关于vim配置:
我想要给文本设置行号,让vim像vscode一样支持符号匹配,代码缩进,于是在~/.vimrc文件中写入如下代码:
(参考这篇文章:https://www.cnblogs.com/write-hua/p/7697762.html )
set nu
set smartindent
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
比如我后面想要全选文本,如果直接选中文本,会把行号也选中,那就要对 本文件 取消行号:
在命令行模式下:
:set nonu
关于vim模式
在写代码的过程中对vim模式有了更清晰直观的认识。(以下是我本次用到的)