管道:通常指无名管道,是 UNIX 系统 IPC 最古老的形式。
特点:
原型:
#include
Int pipe(int fd[2]); //返回值,若成功返回 0,失败返回-1。
当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开
#include
#include
int main()
{
int fd[2]; //两个文件秒速符
pid_t pid; //获取进程编号
char buf[20];
if(pipe(fd) < 0) //创建管道
{
printf("create pipe error\n");
}
if((pid = fork()) < 0) //创建子进程
{
printf("fork error\n");
}
else if(pid > 0)
{
close(fd[0]); //关闭读端
write(fd[1],"hello world\n",12);
}
else
{
close(fd[1]); //关闭写端
read(fd[0],buf,20);
printf("%s",buf);
}
return 0;
}
FIFIO:也称为命名管道,它是一种文件类型
特点:
原型:
#include
//返回值:成功返回 0,出错返回-1。
int mkfifo (const char *pathname, mode_t mode ) ;
消息队列:是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
特点:
信号量:用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点:
共享内存:指的领个或多个进程共享一个给定的存储区
特点:
套截字:可以用于不同机器间的通信。
进程:就是一个内存中的运用程序,一个程序只能有一个进程。进程在内存中有自己的空间,一个进程至少有一个线程。(进程就是资源分配的最小单位)
线程:进程中的一个执行单元(是程序执行的最小单位)
1.TCP协议传输的时候需要建立连接(通过三次握手来建立)。
UPD不需要建立连接。
2.TCP的协议更加准确(有序,无差错)。
UDP的协议可能会有丢失。
3.TCP面向字节流,能把信息分组。
UDDP面向数据,不能把信息分组。
第一次握手:客户端向服务端发起请求,并发送一个SYN包。
第二次握手:服务端收到客户端的请求,回复刚才的SYN包,并附加一个ask包。
第三次握手:客户端回复服务端这个ask包,确认正确。
重点:
TCP协议是全双工的,所以客户端或者服务端都能发起请求。
为了解决网络通信不安全的问题。
原因:
在第一次握手的时候,客户端发送了一个SYN包,但是由于一些原因。这个SYN包没有到达服务端,而在中途停留。客户端就会又发起一个SYN_1包,然后按照三次握手的原则完成连接,这个时候SYN包到了服务端,依旧按照三次握手完成了连接。这个时候的客户端是只有一个连接SYN_1的。而服务端是两个连接SYN和SYN_1的。所以为了保证准确,我们需要三次挥手。
第一次挥手:客户端向服务端说我这边没有需求了,并发送了一个FIN包
第二次挥手:服务端向客户端回复好的,并发送了一个ACK包(客户端还可以接受信息)
第三次挥手:服务端向客户端发送消息,我这边没有数据了可以关闭,并发送一个FIN包
第四次挥手:客户端向服务端回复好,并回复一个ACK包(客户端进入一个超时等待状态,防止发送的第四次挥手发送ACK包服务端没有收到,可以再补发一个)
什么是互斥锁:当多个线程对一个资源进行访问的时候,我们需要对线程进行加锁处理,这样我们可以让线程按照顺序一个一个的访问而不是一拥而上。
死锁是什么:就是相当于一个循环,我拿着你家门钥匙,你拿着他家门钥匙,他拿着我家门钥匙,那么谁都不能回家,这就叫死锁。