有名管道进程间通信

接收数据端recv.cpp

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

typedef struct TestData_t
{
    /* data */

    int attr1;
    char attr2[32];

} TestData_t;

class PipeRead
{
private:
    /* data */
    const char *m_pipe_file = "/tmp/fifo";
    int m_fd;

public:
    PipeRead(/* args */);
    ~PipeRead();

    int RecvData(char *buf, int size);
};

PipeRead::PipeRead(/* args */)
{

    mkfifo(m_pipe_file, S_IWUSR | S_IRUSR);

    m_fd = open(m_pipe_file, O_RDONLY);
    if (0 > m_fd)
    {
        printf("open pipe_file error \n");
    }
}

PipeRead::~PipeRead()
{
    close(m_fd);
}

int PipeRead::RecvData(char *buf, int size)
{
    return read(m_fd, buf, size);
}

int main()
{
    int ret = -1;

    printf("fifo create success\n");

    PipeRead recv_client;

    TestData_t data;
    // printf("data.attr1: %d, data.attr2: %s \n", data.attr1, data.attr2);
    // send_client.SendData();

    while (true)
    {
        /* code */
        ret = recv_client.RecvData((char *)&data, sizeof(TestData_t));
        printf("ret : %d\n", ret);
        if (ret == 0)
        {
            printf("send data finish, ");
            printf("write process close \n");

            break;
        }
        if (ret < 0)
        {
            /* code */
            printf("read error \n");
            sleep(1);
            continue;
        }

        printf(" recv data.attr1: %d, data.attr2: %s \n", data.attr1, data.attr2);
    }

    return 0;
}

发送数据端 send.cpp

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

typedef struct TestData_t
{
    /* data */

    int attr1;
    char attr2[32];

} TestData_t;

class PipeWrite
{
private:
    /* data */
    const char *m_pipe_file = "/tmp/fifo";
    int m_fd;

public:
    PipeWrite(/* args */);
    ~PipeWrite();

    int SendData(char *buf, int size);
};

PipeWrite::PipeWrite(/* args */)
{

    mkfifo(m_pipe_file, S_IWUSR | S_IRUSR);

    m_fd = open(m_pipe_file, O_WRONLY);
    if (0 > m_fd)
    {
        printf("open pipe_file error \n");
    }
}

PipeWrite::~PipeWrite()
{
    close(m_fd);
}

int PipeWrite::SendData(char *buf, int size)
{
    return write(m_fd, buf, size);
}

void signal_process(int sig)
{
    printf("recv process closed\n");
    exit(1);
}

int main()
{
    int i = 0;
    signal(SIGPIPE, signal_process);

    printf("fifo create success\n");

    PipeWrite send_client;
    while (true)
    {
        /* code */
        TestData_t data = {i++, "hello world"};
        printf("data.attr1: %d, data.attr2: %s \n", data.attr1, data.attr2);
        send_client.SendData((char *)&data, sizeof(TestData_t));
        sleep(3);
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值