资源暂时不可用

Posted

技术标签:

【中文标题】资源暂时不可用【英文标题】:Resource temporarily unavailable 【发布时间】:2013-04-23 11:54:31 【问题描述】:

考虑一下这个线程,它就像一个定时器,向串口发送一些数据包:

void PlCThead::run()

    while(1)
    
        const char str[]=UPDATE_PACKET;

        QByteArray  built;
        built.append(0x02);
        built.append(0x05);
        built.append(0x03);

        emit requestForWriteAndReceive(built);

        msleep(100);
    

emit 工作正常,它进入插槽,在那里,它只将 78 或 char x 写入串行而不是 3 个字节的数据包。

bool RS::rs_ThreadPlcDataAqustn(QByteArray byteArray)

    QByteArray rd15Bytes;

    char *data = byteArray.data();
    int len = byteArray.length();

    if(!rs_serialWrite(data, len))
    
        qDebug() << "Failure:( rs_dataqustn: rs_plcWrite(data, len)";
        emit plc_port_dscntd();
        return false;
    


bool RS::rs_serialWrite(char* buff, size_t length)
  
    int tries;

    int len;

    tries = 0;

    QByteArray built((char*)buff, length);

    qDebug() << built.toHex();


            len = write(fd, buff, length);

            qDebug() << len;

            qDebug() << strerror(errno);

            return true;

fd 是这样创建的:

fd = open(portPath, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK, S_IWUSR | S_IRUSR | S_IXUSR);

这是在主窗口中创建线程的方式:

rs_plc->rs_plcOpenPort((char *)"/dev/ttyS0"); /*/dev/ttyS3*/

PlCThead *thread = new PlCThead();
connect(thread, SIGNAL(requestForWriteAndReceive(QByteArray)), rs_plc, SLOT(rs_ThreadPlcDataAqustn(QByteArray )));
thread->start();

rs_plc 是 MainWindow 的私有成员。

strerror 返回此警告:

> Resource temporarily unavailable

有什么想法吗?这段代码在定时器上工作得很好,它已经过准确的检查和测试,但现在我需要添加这个线程而不是定时器。谢谢

【问题讨论】:

为什么你在信号中传输char str而不是QByteArray 【参考方案1】:

您的问题不够完整,无法进行全面诊断,因为您没有展示fd 的创建方式、线程的设置方式(您说这是问题的一部分)等。

但是...您的resource temporarily unavailable 行是一个很大的提示。 write() 函数没有成功写入所有内容,因为它返回了一个错误(可能是EAGAINEWOULDBLOCK)。 fd 文件描述符附加到具有小缓冲区、没有缓冲区或缓冲区已满的内容。它已经满了,在它可以处理之前不发送任何其他内容是应用程序的工作。如果错误代码为EAGAINEWOULDBLOCK,则通常是睡觉,然后再次尝试写入。

但是,您说它返回 3,这实际上也表示“没有错误”。如果是这种情况,那么错误字符串将不会指代 write 本身,而是之前设置的 errno 。 (过去可能是 write 本身)。

简而言之,如果它被多次调用(很可能),您可能需要注意写入速度太快(而且它看起来像一个串行缓冲区,它肯定属于易于填充的类别-缓冲区)。

简而言之:如果它没有将所有字节写入fd,那是因为它无法处理更多。

顺便说一句,这可能与qt 完全无关。都是关于write() 电话的。

【讨论】:

我更新了我上面的代码,还是不明白是什么问题 不确定这是否与 qt 无关,我加载 URL 时只有 3 行代码,它卡住了!在 3 台虚拟机和 1 台物理机上,在 strace 中出现完全相同的错误,我缺少什么?

以上是关于资源暂时不可用的主要内容,如果未能解决你的问题,请参考以下文章

警告:unlink() 资源暂时不可用

接受错误:资源暂时不可用

markdown fork:retry:资源暂时不可用

使用 uwsgi + nginx 资源暂时不可用

资源暂时不可用,UDP socket

读取套接字:EAGAIN:资源暂时不可用