Linux--进程间的通信-匿名管道
进程间的通信
进程间通信(IPC,Interprocess Communication)是指在不同进程之间传输数据和交换信息的一种机制。它允许多个进程在同一操作系统中同时运行,并实现彼此之间的协作。
进程间通信方式:
-
管道(Pipe):管道是最基本的进程间通信方式,它是一种半双工的通信方式,通过管道,可以实现两个不同进程之间的通信,使用时,只能一方写入,另一方读出。
-
消息队列(Message Queue):消息队列可以在没有任何关系的进程之间传递数据,它提供了一个消息的队列,发送方将消息放入队列,接收方从队列中获取消息。这种通信方式允许发送方和接收方独立于对方,不需要同步操作。
-
共享内存(Shared Memory):共享内存是最快的进程间通信方式,它将一个特定的内存区域映射到多个进程的地址空间中,使得这些进程可以直接访问这块共享内存。共享内存通信方式适合于大量数据的高速交换。
-
信号量(Semaphore):信号量是一种计数器,用于进程间的同步和互斥操作。它可以用来保护临界区资源,控制并发访问和协调进程间的操作顺序。
-
套接字(Socket):套接字是一种网络编程中常用的通信方式,它可以在不同主机之间进行进程间通信。套接字通信方式适用于分布式系统或者网络环境下的进程间通信。
-
管理器对象(Manager Object):这种通信方式利用一个专门的进程作为服务器,其他进程通过请求服务器来实现通信。管理器对象可以提供共享数据、远程过程调用等功能。
-
文件和数据库:进程可以通过读取和写入文件、数据库的方式进行通信。这种通信方式适用于持久化数据的交换和共享。
匿名管道
匿名管道,顾名思义也就是没有名字的管道,这种管道用于具有血缘关系的进程(父子进程等)之间进行通信。它是一种单向通信方式(半双工),即数据只能从一个进程流向另一个进程;
下面来了解匿名管道是如何创建的?
代码验证
#include #include #include #include #include void writer(int wfd) { const char* str="hello father,i am child"; char buffer[128]; int cnt=0; pid_t pid=getpid(); while(1) { snprintf(buffer,sizeof(buffer),"message: %s, pid: %d,count:%d\n",str,pid,cnt); write(wfd,buffer,sizeof(buffer)-1); cnt++; sleep(1); } } void reader(int rfd) { char buffer[1024]; while(1) { ssize_t n=read(rfd,buffer,sizeof(buffer)-1); printf("father get a message: %s",buffer); } } int main() { int pipefd[2]; int n=pipe(pipefd); if(n close(pipefd[0]); writer(pipefd[1]); exit(0); } close(pipefd[1]); reader(pipefd[0]); wait(NULL); return 0; }