linux - 为什么不在析构函数中关闭串口?

标签 linux qt destructor

我使用 socat 创建虚拟串口:

$socat -d -d pty,raw,echo=0 pty,raw,echo=0

然后通过我的程序打开它并通过 Ctrl+c 停止程序,再次运行后让我收到这条消息:

“无法打开端口 pts/9,错误:设备或资源繁忙”

#include "serport.h"
#include <QCoreApplication>


int main(int argc, char *argv[])
{

    QCoreApplication a(argc, argv);

    QSerialPort serialPort;
    serialPort.setPortName("/dev/pts/9");
    serialPort.setBaudRate(QSerialPort::Baud9600);

    if (!serialPort.open(QIODevice::ReadOnly)) {
        qDebug() << QObject::tr("Failed to open port %1, error: %2").arg(serialPort.portName()).arg(serialPort.errorString()) << endl;
        return 1;
    }

    serport port(&serialPort,&a);
    a.connect(&a, SIGNAL(aboutToQuit()), &serialPort, SLOT(deleteLater()));
    a.connect(&a, SIGNAL(aboutToQuit()), &port, SLOT(deleteLater()));

    return a.exec();
}

服务端口

#ifndef SERPORT_H
#define SERPORT_H

#include <QDebug>
#include <QObject>
#include <QtSerialPort/QSerialPort>

class serport : public QObject
{
    Q_OBJECT
public:
    explicit serport(QSerialPort *serialPort, QObject *parent);
    ~serport();
    QSerialPort *port;
signals:

public slots:
};

#endif // SERPORT_H

服务端.cpp

#include "serport.h"
serport::serport(QSerialPort *serialPort, QObject *parent) : QObject(parent),port(serialPort){ }

serport::~serport(){
    qDebug()<<"closing";
    port->close();
}

如何正确关闭端口?为什么在我的程序中从来没有看到“关闭”消息?

最佳答案

这是关于在不调用所有释放处理程序的情况下退出进程。更多的是特定于 Linux 而不是 Qt。但是你仍然可以做点什么。确保使用 Qt 为 Ctrl-c 创建用户处理程序。

QApplication: How to shutdown gracefully on Ctrl-C

关于linux - 为什么不在析构函数中关闭串口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32668210/

相关文章:

qt - 如何从源代码构建具有 c++14 支持的 Qt 5

c++ - 在动态内存分配后将整数传递给构造函数

Java:Executor Service 在 linux 上运行缓慢而不是在 Windows 上

linux - 无法将存储库克隆到 linux 上的 jenkins

php - Linux 灯需要文件

linux - 如何删除具有匹配模式的整行仅存在于列范围 75 到 104 中

c++ - 从 QML 访问 QStandardItemModel 的项目

Qt LGPL 许可证异常?

c++ - 析构函数默默地做了什么?

C++ - 初始化和销毁​​是如何工作的?