Linux 进程间通信 之 有名管道 (FIFO)

本文深入探讨了有名管道(FIFO)的使用要点,包括其阻塞与非阻塞操作特性,以及在Linux文件系统下创建和读写FIFO的具体实现。通过代码示例展示了如何在Qt环境下创建、写入和读取FIFO,强调了FIFO不能在Windows文件系统如Samba共享目录中创建。适合对Linux进程间通信感兴趣的开发者阅读。

要点:

  1、有名管道在使用时,需得有一方先进行阻塞打开,即阻塞读或阻塞写

  2、若没有一方先进行阻塞打开,则非阻塞的读写会返回文件打开失败

  3、以read方式读取管道时候要判断返回值,即读取到的字节数,在大于0时才表示有有效数据

  4、FIFO不能创建在Windows文件系统下,比如使用Samba共享的文件目录

创建FIFO

void MainWindow::on_pushButton_Create_clicked()
{
    QString status;
    if (access(FifoName, F_OK) == -1)
    {
        /* mkfifo 参数2 表示权限 */
        if (mkfifo(FifoName, 0777) < 0 && (errno != EEXIST))
        {
            status = "Fifo Create Fail";
            qDebug("Fifo创建失败,确认是否是在Linux文件体系下");
        }
        else
        {
            status = "Fifo Create";
        }
    }
    else
    {
        status = "Fifo Exist";
    }
    ui->label_Status->setText(status);
}

写管道


void MainWindow::on_pushButton_Write_clicked()
{
    int fd = open(FifoName.data(), O_WRONLY | O_NONBLOCK); /* 以只写非阻塞方式打开 FIFO 管道 */
    if (fd == -1)
    {
        perror("Open Fail"); /* 打印具体的错误信息 */

        qDebug("Addr:%s", FifoName.data());
        return;
    }
    write(fd, ui->textEdit_Write->toPlainText().toUtf8().data(), 4096);
    ::close(fd);
}

管道读(开辟了个新线程进行读)


void FifoReadThread::run()
{
    char* file = new char[FifoName.size()];
    strcpy(file, FifoName.toUtf8().data());

    if (access(file, F_OK) == -1)
    {
        if (mkfifo(file, 0777) < 0 && (errno != EEXIST))
        {
            perror("Fifo Create Fail");
            exit(1);
        }
    }
    int fd;

    while (1)
    {
        fd = open(file, O_RDONLY); /* 以只读阻塞方式打开命名管道 */
        if (fd == -1)
        {
            perror("Open Fail");
            exit(1);
        }

        int nread = read(fd, Buffer, 4096);
        if (nread > 0)
        {
            emit FifoRead();
        }
        ::close(fd);
    }

    delete file;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值