当前位置:   article > 正文

Linux--进程间的通信-匿名管道

Linux--进程间的通信-匿名管道

进程间的通信

进程间通信(IPC,Interprocess Communication)是指在不同进程之间传输数据和交换信息的一种机制。它允许多个进程在同一操作系统中同时运行,并实现彼此之间的协作

进程间通信方式:

  1. 管道(Pipe)管道是最基本的进程间通信方式,它是一种半双工的通信方式,通过管道,可以实现两个不同进程之间的通信,使用时,只能一方写入,另一方读出。

  2. 消息队列(Message Queue):消息队列可以在没有任何关系的进程之间传递数据,它提供了一个消息的队列,发送方将消息放入队列,接收方从队列中获取消息。这种通信方式允许发送方和接收方独立于对方,不需要同步操作

  3. 共享内存(Shared Memory)共享内存是最快的进程间通信方式,它将一个特定的内存区域映射到多个进程的地址空间中,使得这些进程可以直接访问这块共享内存。共享内存通信方式适合于大量数据的高速交换

  4. 信号量(Semaphore):信号量是一种计数器,用于进程间的同步和互斥操作。它可以用来保护临界区资源,控制并发访问和协调进程间的操作顺序。

  5. 套接字(Socket):套接字是一种网络编程中常用的通信方式,它可以在不同主机之间进行进程间通信。套接字通信方式适用于分布式系统或者网络环境下的进程间通信。

  6. 管理器对象(Manager Object):这种通信方式利用一个专门的进程作为服务器,其他进程通过请求服务器来实现通信。管理器对象可以提供共享数据、远程过程调用等功能。

  7. 文件和数据库:进程可以通过读取和写入文件、数据库的方式进行通信。这种通信方式适用于持久化数据的交换和共享。

匿名管道

匿名管道,顾名思义也就是没有名字的管道,这种管道用于具有血缘关系的进程(父子进程等)之间进行通信。它是一种单向通信方式(半双工),即数据只能从一个进程流向另一个进程;

下面来了解匿名管道是如何创建的?
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码验证

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

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<0) return 1;
    printf("pipefd[0]:%d,pipefd[1]:%d\n",pipefd[0],pipefd[1]);

    pid_t id=fork();
    if(id==0)
    {
        close(pipefd[0]);

        writer(pipefd[1]);

        exit(0);
    }

    close(pipefd[1]);

    reader(pipefd[0]);
    wait(NULL);

    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对匿名管道的具体分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

匿名管道的特点

  • 1.匿名管道只能用于具有情缘关系(父子进程)的进程间通信;
  • 2.自带同步机制
  • 3.管道只能单向通信,属于半双工通信类型;
  • 4.只要连接的进程有一方退出,那么管道自动释放,文件的生命周期是伴随着进程的;

PIPE_BUF

PIPE_BUF是一个宏定义,在Linux系统中,它表示管道(pipe)的缓冲区大小(一般为4096字节)。具体来说,PIPE_BUF定义了一个原子写入管道的最大字节数。

根据POSIX标准规定,当要写入的数据长度小于等于PIPE_BUF时,操作系统会保证写入的原子性。也就是说,对于不超过PIPE_BUF字节的写操作,写入的数据会作为一个连续序列写入管道,而不会被其他进程的写操作所中断

然而,当要写入的数据长度超过PIPE_BUF时,操作系统并不保证写入的原子性。这意味着,写入的数据可能会被其他进程的写操作所中断,从而导致数据交叉写入到管道中

需要注意的是,PIPE_BUF的值可以在不同的系统上有所不同。在大多数系统中,PIPE_BUF的值通常为4096字节(4KB),但也可以更大或更小。你可以通过在代码中包含头文件limits.h并查看其中的定义来获取当前系统上的PIPE_BUF值。

所以,在使用管道进行进程间通信的时候,如果希望保证数据的完整性,应确保每次写入的数据不超过PIPE_BUF字节。如果要写入的数据量超过了PIPE_BUF,可以考虑分多次写入或使用其他方式来保证数据的完整性

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号