簡體   English   中英

寫入Linux設備驅動程序會導致無限循環

[英]Writing to Linux device driver causes infinite loop

我一直在編寫一個可以從用戶空間讀取和寫入的內核空間設備驅動程序。 開放,閱讀,發布操作都完美無缺。 我遇到的問題是應該訪問設備驅動程序並向其寫入內容的用戶空間代碼。

用戶空間程序寫入兩個文件:1)到.txt文件(並打印到控制台以讓用戶知道它已完成),以及2)到設備驅動程序(並且還打印文本以讓用戶知道它也已完成)。

以下是完整的用戶空間代碼:

int main() {
    FILE *fp;

    fp = fopen("./test.txt","w");
    fputs("Test\n", fp);
    fclose(fp);
    printf("Printed to txt\n"); //Prints normally.

    fp = fopen("/dev/testchar", "w");        
    fputs("Test\n", fp);
    fclose(fp);
    printf("Printed to dev\n"); //Never gets to this point

    return 0;
}

當我編譯並運行代碼程序吐出時

Printed to txt

然后掛起,直到調用ctrl + c。 它永遠不會超越第二個fputs()

在監視kern.log我看到無限次調用寫入設備驅動程序。

這里我從設備驅動程序中提取了相關代碼:

static char msg[256] = {0};

static struct file_operations fops =
{
    .write = dev_write
};


static ssize_t dev_write(struct file *file, const char *buf, size_t len, loff_t *ppos)
{
    sprintf(msg, "Input:%s, Chars:%lu\n", buf, len);
    printk(KERN_NOTICE "%s\n", msg);

    return 0;
}

uname -r: 4.10.0-38-generic

gcc -v: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

我的問題是:為什么程序在寫入設備時會陷入無限循環,我該如何解決?

提前致謝。 任何幫助將不勝感激。

我認為內核寫操作應該返回寫入的字節數。 您返回0.因此,寫入系統調用返回到用戶空間為0.但是,由於您的用戶空間代碼使用stdio,因此您的用戶空間代碼會再次嘗試寫入,假設系統調用只是沒有寫出所有數據。 如果返回輸入的長度,則stdio將知道所有數據都已寫入。 或者,您可以直接使用write系統調用而不是fputs 您的內核代碼仍然不正確,但您的程序將終止。 您可以使用strace測試它並查看所有系統調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM