使用信号处理程序处理从 fifo 接收到的数据

弗莱兹

我正在编写一个与 fifo 的简单客户端/服务器通信,但我坚持使用信号处理程序来处理客户端请求。

服务器以只读和非阻塞模式打开一个fifo,读取接收到的数据并将一些数据写回客户端fifo。

当服务器端没有信号处理程序时,这实际上工作正常。这是双方的主要代码。

服务器 :

int main(int argc, char *argv[])
{
    // install handler
    struct sigaction action;

    action.sa_handler = requestHandler;

    sigemptyset(&(action.sa_mask));

    action.sa_flags = SA_RESETHAND | SA_RESTART;

    sigaction(SIGIO, &action, NULL);

    if(!makeFifo(FIFO_READ, 0644))
        exit(1);

    int rd_fifo = openFifo(FIFO_READ, O_RDONLY | O_NONBLOCK); // non blocking

    if(rd_fifo == -1)
        exit(1);

    // wait for request and answer
    while (1) {
        qWarning() << "waiting client...";
        sleep(1);
        QString msg = readFifo(rd_fifo);

        qWarning() << "msg = " << msg;

        if(msg == "ReqMode") {
            int wr_fifo = openFifo(FIFO_WRITE, O_WRONLY); // blocking
            writeFifo(wr_fifo, QString("mode"));
            break;
        } else
            qWarning() << "unknow request ..";
    }

    close(rd_fifo);
    unlink(FIFO_READ);

    return 0;
}

客户 :

int main(int argc, char *argv[])
{
    int wr_fifo = openFifo(FIFO_WRITE, O_WRONLY);

    if(wr_fifo == -1)
        exit(1);

    // create a fifo to read server answer
    if(!makeFifo(FIFO_READ, 0644))
        exit(1);

    // ask the server his mode
    writeFifo(wr_fifo, QString("ReqMode"));

    // read his answer and print it
    int rd_fifo = openFifo(FIFO_READ, O_RDONLY); // blocking
    qWarning() << "server is in mode : " << readFifo(rd_fifo);

    close(rd_fifo);
    unlink(FIFO_READ);

    return 0;
}

一切都按预期工作(即使所有错误都没有得到正确处理,这只是一个示例代码来证明这是可能的)。

问题在于,当客户端将数据写入 fifo 时,永远不会调用处理程序(此处未显示,但它仅在接收到信号的终端上打印一条消息)。此外,我检查了是否kill -SIGIO从 bash(或从其他地方)向服务器发送信号处理程序。

谢谢你的帮助。

弗莱兹

实际上,我错过了服务器端的以下 3 行:

fcntl(rd_fifo, F_SETOWN, getpid()); // set PID of the receiving process

 fcntl(rd_fifo, F_SETFL, fcntl(rd_fifo, F_GETFL) | O_ASYNC); // enable asynchronous beahviour

 fcntl(rd_fifo, F_SETSIG, SIGIO); // set the signal that is sent when the kernel tell us that there is a read/write on the fifo.

最后一点很重要,因为在我的情况下发送的默认信号是 0,所以我必须明确地将它设置为 SIGIO 以使事情正常工作。这是服务器端的输出:

waiting client... 
nb_read =  0 
msg =  "" 
unknow request .. 
waiting client... 
signal  29 
SIGPOLL 
nb_read =  7 
msg =  "ReqMode" 

现在,我想可以通过将 while 循环内的内容移动到 requestHandler 函数中来处理处理程序内的请求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用流处理接收到的数据

CentOS8 实时 FIFO 进程未接收到 XCPU 信号

当已经在信号处理程序中时接收到信号会发生什么?

SQS FIFO使用MessageGroupId接收消息

如何告诉Apache Tomcat谁必须处理接收到的数据?

扭曲的Python:接收到的数据与接收到的数据以及我可能应该使用的数据相反

在Android中使用ExtractMpegFramesTest接收到错误的帧数据?

如何使用从HTML页面中的本机应用接收到的数据?

使用从SQL查询接收到的数据填充listview

使用 scapy 修改接收到的数据包 src/dst

将接收到的串行数据事件处理程序添加到f#串行端口读取器

多处理程序支持命名管道(FIFO)吗?

程序接收到信号SIGPIPE,管道损坏

使用管道在C ++中创建调度队列/线程处理程序:FIFO溢出

运行Crystal程序时,程序已收到并且未处理信号IOT(6)

按顺序处理FIFO SQS消息

如何处理 FIFO 的多个同时输入?

对守护进程使用fifo

使用循环对数据进行分组(MATLAB 中的信号处理)

在烧瓶应用程序中使用get_json()解码接收到的PUT数据时收到错误

在rabbitmq中实现消息处理程序来处理接收到的消息

如何处理接收到的数据以将其保存在数据库Laravel和Ajax中?

SDL2&GDB:程序接收到信号?,未知信号

使用处理程序遍历数据

如果使用Java接收到数据,如何制作一个从服务器接收数据并将数据发送到服务器的程序

Libcurl错误无法将接收到的数据写入磁盘/应用程序

Go例程未接收到通过通道发送的所有数据-玩具示例程序

接收到的数据在不在程序中的范围内是正确的

aws fifo 队列无法接收 messageGroupID