IPC 进程间通信 interprocess communicate
IPC(Inter-Process Communication),即进程间通信,其产生的原因主要可以归纳为以下几点:
进程空间的独立性
-
资源隔离:在现代操作系统中,每个进程都拥有自己独立的代码和数据空间。这种隔离机制确保了进程之间的安全性和稳定性,但同时也使得进程间无法直接访问对方的资源。
-
资源无法共享:由于进程空间的独立性,一个进程无法直接读取或修改另一个进程的内存空间中的数据。这种情况下,如果需要进行数据交换或共享资源,就需要通过特定的机制来实现。
进程间协作的需求
-
数据交换:在多进程操作系统中,不同的进程可能需要交换数据以完成共同的任务。例如,一个进程可能负责生成数据,而另一个进程则负责处理这些数据。为了实现这种数据交换,就需要使用IPC机制。
-
资源共享:进程间通信还允许进程共享资源,如文件、数据库、内存等。通过IPC,进程可以协调对共享资源的访问,避免冲突和竞争条件。
-
任务协调:在分布式系统或并发编程中,多个进程可能需要协同工作以完成复杂的任务。IPC提供了进程间同步和互斥的机制,确保任务能够按照预定的顺序和条件执行。
IPC的必要性
-
提高系统并发性:通过IPC,多个进程可以并行处理不同的任务,从而提高系统的并发处理能力。
-
优化资源利用:IPC允许进程共享资源,减少了资源的重复分配和浪费,提高了资源利用率。
-
实现复杂功能:在构建复杂的软件系统时,往往需要多个进程协同工作。IPC为这些进程之间的通信和协作提供了必要的支持。
IPC的实现方式
IPC的实现方式多种多样,包括但不限于以下几种:
-
管道(Pipe):一种单向通信方式,常用于具有亲缘关系的进程间通信。
-
消息队列(Message Queue):允许多个进程从同一个队列中读取数据,具有独立性和异步性。
-
共享内存(Shared Memory):一段可以被多个进程同时访问的物理内存区域,提高了进程间的数据交换效率。
-
信号(Signal):一个进程向另一个进程发送信号来传递某种信息或通知某个事件的发生。
-
套接字(Socket):用于不同主机之间的进程通信,提供了网络通信的能
管道==》无名管道、有名管道
无名管道 ===》pipe ==》只能给有亲缘关系进程通信
有名管道 ===》fifo ==》可以给任意单机进程通信
管道的特性:
1、管道是 半双工的工作模式(收或者发)
2、所有的管道都是特殊的文件不支持定位操作。不支持lseek->> fd fseek ->>FILE*
3、管道是特殊文件,读写使用文件IO。fgets,fread,fgetc,
一般情况下使用open,read,write,close;
主要看是否是二进制文件,如果是文本文件使用fges之类的标准io。
注意事项:
1,读端存在,一直向管道中去写,超过64k,写会阻塞。(写的快,读的慢)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int pipefd[2]={0};
int ret = pipe(pipefd);
if(-1 == ret)
{
perror("pipe");
exit(1);
}
pid_t pid = fork();
if(pid>0)
{
char buf[]="hello,world";
close(pipefd[0]);
sleep(3);
write(pipefd[1],buf,strlen(buf));
}
else if(0 == pid)
{
close(pipefd[1]);
char buf[100]={0};
read(pipefd[0],buf,sizeof(buf));
printf("pipe %s\n",buf);
}
else
{
perror("fork");
exit(1);
}
return 0;
}
2,写端是存在的,读管道,如果管道为空的话,读会阻塞(读的快,写的慢)
读阻塞和写阻塞都是正常情况。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{