管道
- 有名管道:在磁盘上有一个文件标识,创建管道文件,但是交互的数据并不会存储到磁盘中,管道文件不会占据磁盘空间。有名管道没有在磁盘上存真正的信息,而是在内存中存放,2个进程结束后自动丢失,通信结束后有名管道的文件路径本身存在,这是和无名管道区别的地方。
- 无名管道:首先创建一个管道文件,无名管道是一种特殊类型的文件,在内核空间中对应的资源即是一段内存空间,内核在这段空间以循环对列的方式临时存入一个进程发送给另一个进程的信息,这段内核空间完全由操作系统管理和维护,应用程序只需要,也只能通过系统调用来访它。
//无名管道代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
int main()
{
int fds[2] = {-1, -1};
int res = pipe(fds); //创建管道, fds[0] 读端 fds[1] 写端
assert(-1 != res);
pid_t n = fork();
assert(-1 != n);
if(0 == n) //子进程负责读,所以要关闭写端
{
close(fds[1]);
while(1)
{
char readbuff[128] = { 0 };
int n = read(fds[0], readbuff, 127);
if(n < 0 || 0 == strncmp(readbuff, "end", 3))
{
break;
}
printf("child: %s\n", readbuff);
}
close(fds[0]);
}
else //父进程负责写,因此要先关闭读端
{
close(fds[0]);
while(1)
{
printf("plese input\n");
char writebuff[128] = { 0 };
fgets(writebuff, 128, stdin);
write(fds[1], writebuff, strlen(writebuff) - 1);
if(0 == strncmp(writebuff, "end", 3))
{
break;
}
}
close(fds[1]);
}
return 0;
}
信号
信号量
信号量类似于一个计数器,当信号量的值大于0时,记录临界资源的个数,当信号量等于时,进程访问临界资源时必须阻塞。
消息队列
共享内存
共享内存是通过内核对象,将多个进程中的一个虚拟地址映射到内核对象所申请的一块物理内存上,从而实现进程间数据的通讯。
如图所示:
- 步骤:
1. 创建内核对象,并且申请物理内存。
2. 链接,即各进程通过虚拟地址映射到同一物理内存上。
3. 通过ptra,ptrb分别访问这块物理内存。
socket套接字
socket通过TCP传输,UDP传输