Linux进程间通信之管道

本文介绍了Linux下进程间通信(IPC)中的管道机制,包括无名管道和有名管道的概念、工作原理。通过一个服务器和客户端的C++代码示例,展示了如何创建和使用管道进行数据传输。特别指出,管道数据长度限制为64K,使用时需要注意。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux进程间通信之管道

进程间通信 (IPC ) Inter-Process Communication

比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息。

linux下IPC机制的分类

​ 管道、信号、共享内存、消息队列、信号量、套接字

特点
  1. 管道是最古老的IPC,但目前很少使用
  2. 以文件做交互的媒介,管道分为有名管道和无名管道
  3. 历史上的管道通常是指半双工管道,如果需要双向通信,则创建两个管道

3.2 管道:有两种形式,命令行和非命令行

编程模型:进程A创建管道(mkfifo) -> 进程A写打开管道(open) -> 进程B读打开管道(open) -> 进程A开始往管道里写数据(write) ->

进程B从管道中读数据(read) -> 进程A关闭管道(close) -> 进程B关闭管道(close) -> 删除管道(unlink)

有名管道(实例):

Server:

#include <iostream>
#include<sys/stat.h>
#include<fcntl.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;




#define PIPEWRITENAME "/home/qgm/pipeWriteServer"
#define PIPEREADNAME "/home/qgm/pipeReadServer"


void *readFun(void *arg)
{
    //删除管道
    unlink(PIPEREADNAME);

    // 创建管道
    if(mkfifo(PIPEREADNAME, 0666) < 0)
    {
        perror("mkfifo");
        return (void*)-1;
    }

    // 写打开管道
    int fd = open(PIPEREADNAME, O_RDWR);
    if(-1 == fd)
    {
        perror("open");
        return (void*)-1;
    }


    int i = 0;
    for(i = 0; i < 100000; i++)
    {
        int n = 0;
        read(fd, &n, sizeof(n));
        printf("server read %d\n", n);
        sleep(1); // 这个是以秒为单位挂起
    }

    // 关闭管道
    close(fd);
    return (void *)0;
}


void *writeFun(void *arg)
{
	//删除管道
    unlink(PIPEWRITENAME);

    // 创建管道
    if(mkfifo(PIPEWRITENAME, 0666) < 0)
    {
        perror("mkfifo");
        return (void*)-1;
    }

    // 写打开管道
    int fd = open(PIPEWRITENAME, O_RDWR);
    if(-1 == fd)
    {
        perror("open");
        return (void*)-1;
    }

    int i = 0;
    for(i = 0; i < 100000; i++)
    {
        write(fd, &i, sizeof(i));
        printf("server write %d\n", i);
        sleep(1); // 这个是以秒为单位挂起
    }

    // 关闭管道
    close(fd);
    return (void *)0;
}

int main()
{

    pthread_t tid;
    pthread_create(&tid, NULL, writeFun, NULL);
    pthread_create(&tid, NULL, readFun, NULL);

    sleep(100000);
    return 0;

}

client:

#include <iostream>
#include<sys/stat.h>
#include<fcntl.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;




#define PIPEWRITENAME "/home/qgm/pipeWriteServer"
#define PIPEREADNAME "/home/qgm/pipeReadServer"


void *readFun(void *arg)
{


    // 写打开管道
    int fd = open(PIPEWRITENAME, O_RDONLY);
    if(-1 == fd)
    {
        perror("open");
        return (void*)-1;
    }


    int i = 0;
    for(i = 0; i < 100000; i++)
    {
        int n = 0;
        read(fd, &n, sizeof(n));
        printf("client read %d\n", n);
        sleep(1); // 这个是以秒为单位挂起
    }

    // 关闭管道
    close(fd);
    return (void *)0;
}


void *writeFun(void *arg)
{



    // 写打开管道
    int fd = open(PIPEREADNAME, O_RDWR);
    if(-1 == fd)
    {
        perror("open");
        return (void*)-1;
    }

    int i = 0;
    for(i = 0; i < 100000; i++)
    {
        write(fd, &i, sizeof(i));
        printf("client write %d\n", i);
        sleep(1); // 这个是以秒为单位挂起
    }

    // 关闭管道
    close(fd);
    return (void *)0;
}

int main()
{

    pthread_t tid;
    pthread_create(&tid, NULL, readFun, NULL);
    pthread_create(&tid, NULL, writeFun, NULL);

    sleep(100000);
    return 0;

}

注意:管道的数据长度为64K,所以使用的时候需要注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值