要点:
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;
}
本文深入探讨了有名管道(FIFO)的使用要点,包括其阻塞与非阻塞操作特性,以及在Linux文件系统下创建和读写FIFO的具体实现。通过代码示例展示了如何在Qt环境下创建、写入和读取FIFO,强调了FIFO不能在Windows文件系统如Samba共享目录中创建。适合对Linux进程间通信感兴趣的开发者阅读。
&spm=1001.2101.3001.5002&articleId=106924371&d=1&t=3&u=59788b59b9e44dd7bd0ed3db1ded56a2)
2308

被折叠的 条评论
为什么被折叠?



