每次打开一个网页都是一个进程
进行管道之间通信的方式:以前学到的有可以在磁盘上开辟空间进行交互,也可以在内存中开辟缓冲区进行交互。
一定注意可读性
管道就是属于在内存中的一片缓冲区,管道可以在命令行中创建管道mkfifo也可以在vim中用代码,删除unlink也是这样
管道的本质是一致的,有两个分支可以分为匿名管道仅用于父子进程之间的通信(int num[2]),命名管道需要创建文件进行通信用完后需要删除。
这个地方需要好好理解,先打开匿名管道pipe再fork就会出现像这样的情况,但是一定记得管道是半双工的,因此说不能同时写同时读所以说一般都是关闭一端。
popen和pclose是就是默认连接标准输入和输出
popen就是有点类似system,就是打开一个可执行程序,同时将标准输入或者是标准输出管道将两者进行连接。
管道往往用于少量的数据的传输。管道出现的问题当需要交互的进程比较多的时候,管道的使用次数就比较多,同时从内存拷贝到内核中然后从内核态再拷贝到内存中,比较耗费性能。
因此说这个地方就可以用共享内存来实现,这样的话,两个进程都是读写在一个地方。
问题点可能是在于究竟是都还是写("r","fread"),这个地方是相对于管道而言!!!
一般各个进程之间都是在逻辑有自己的一片虚拟内存,往往各个进程的物理部分也存在不同的位置不能直接进行交互,可以借助于共享内存的方式进行交互,在物理上共享一片内存。
共享内存由主要由两个指令:system V 和POSIX 接口
信息在网络上进行传输必须要具有自我描述性,要不然传过去不知道到底传过去的是什么东西,所以说必须要借助于键值对内容标记。共享内存的键值对也是这样的道理。
在linux中的实现是首先先造一个key(ftok)然后再为这个key分配相应的空间(shmget),然后再将相应的内存与程序空间连接。之后的操作有断开连接(shmdt)以及多功能函数释放共享内存空间修改内存空间权限(shmctl)。
ftok("1.txt", )通过某一个文件产生一个key,究竟是哪一个文件不重要,还有另外一个参数,也是帮助建立不同的键,所以说只要有一个不一样的就会是一个不一样的共享内存区域
共享内存空间的分配一般都是分配一页4096,shmget后面的附加的命令是比较复杂的,可以查看。
框架:
进程间通信可以采用在磁盘上共享,也可以在内存中共享也就是管道。
管道可以分为有名管道和匿名管道,有名管道需要创建文件,匿名管道只能用于父子进程之间。
但是进程的交互比较多的时候,在内存与内核之间来回拷贝耗费的性能比较多
-----》因此说用共享内存
共享内存的开辟三步走,起个名-----造空间------将共享空间与程序连接