如何在linux字符驱动中很好地阻止写入?

问题描述 投票:0回答:1

我正在尝试编写一个 Linux 字符驱动程序,它实现写入特殊硬件链接的“标记 MUX”功能。

write()
向驱动程序发出请求,将数据馈送到
kfifo
中,并且单独的内核线程根据需要从 FIFO 中提取数据。如果 FIFO 已满,则用户空间写入文件描述符的操作应阻塞,直到 FIFO 空间可用为止。

如何在字符设备驱动程序中实现此类阻塞?

我在我的字符驱动程序的“写入”处理程序中尝试了这个。当 FIFO 已满时,用户空间进程确实会阻塞,但无法中断或终止。必须重新启动机器。

ssize_t
fifoWrite(struct file *pFile, const char __user *pUserData, size_t nBytes, loff_t *pOffset)
{
    unsigned char         *pktData = 0;

    pktData = memdup_user(pUserData, nBytes); // copy n bytes from user to kernel
    if (IS_ERR(pktData))
        return PTR_ERR(pktData);

    TDataPacket pkt;
    memcpy(pkt.buf, pktData, nBytes);

    while (kfifo_put(&pktFifo, pkt) == 0)
    {
        printk(KERN_ERR MODULE_NAME": write - FIFO full\n");
        msleep(1000);
    }

    int fifoLen = kfifo_len(&clientInfo->pktFifo);

    printk(KERN_INFO MODULE_NAME": WRITE - %zu bytes. LEN %d\n", , nBytes, fifoLen);

    kfree(pktData);

    return nBytes;
}
c linux-device-driver
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.