簡體   English   中英

Linux 內核模塊:kernel_write 函數有問題

[英]Linux Kernel Module : Problem with kernel_write function

我在為 Linux 4.14.73 版本開發 LKM 時使用kernel_write函數時遇到問題。

這是我面臨問題的模塊的一部分:

void change_led_state(char *led_path, int led_value)
{


    printk("we are in change_led_state\n");
    size_t len = sizeof(led_value);
    char    lpath[64];
    ssize_t rk=0;

    strncpy(lpath, led_path, sizeof(lpath) - 1);
    lpath[sizeof(lpath) - 1] = '\0';
    f_led = filp_open(lpath, O_WRONLY , 0);

    if (f_led == NULL) {
        printk("Unable to access led\n");
        return;
    }


    rk = kernel_write(f_led, led_value, len, &f_led->f_pos);
    printk("rk = %d\n", rk);
    filp_close(f_led, NULL);
}

rk通常為負值。 我想應該是積極的。 請問這個功能有什么問題嗎? 我該如何糾正它?

有關更多信息,我有相同的代碼,但在用戶空間程序中,並且工作正常,我只想將其替換為內核空間。 這是用戶空間程序:

void change_led_state(char *led_path, int led_value)
{
    char    lpath[64];
    FILE    *led_fd;

    strncpy(lpath, led_path, sizeof(lpath) - 1);
    lpath[sizeof(lpath) - 1] = '\0';

    led_fd = fopen(lpath, "w");

    if (led_fd == NULL) {
        fprintf(stderr, "simplekey: unable to access led\n");
        return;
    }

    fprintf(led_fd, "%d\n", led_value);

    fclose(led_fd);
}


void reset_leds(void)
{
    change_led_state(LED_PATH "/" green "/brightness", 0);
}

void eval_keycode(int code)
{
    static int green_state = 0;

    switch (code) {
    case 260:
        printf("BTN pressed\n");

        // figure out red state
        green_state = green_state ? 0 : 1;

        change_led_state(LED_PATH "/" green "/brightness", green_state);
        break;

    default :
        printf("Wrong Button was pressed\n");
        break;
    }
}

在主要功能中,我只是調用 eval_keycode 功能,它正在工作。 我犯了什么錯誤?

在你的電話中:

    rk = kernel_write(f_led, led_value, len, &f_led->f_pos);

第二個參數應該是一個char * ,但你傳遞的是一個int

此外,當寫入“/sys/class/leds/[device]/brightness”文件時,處理這個的代碼需要一個指向十進制數字字符串的指針,由一些非數字字符(例如換行符)終止) 或空終止符。

您需要將led_value作為十進制數“打印”到char數組,並將數組內容寫入文件:

    char led_valstr[20]; /* should be large enough */

    len = scnprintf(led_valstr, sizeof(led_valstr), "%d\n", led_value);
    rk = kernel_write(f_led, led_valstr, len, &f_led->f_pos);

(編輯:更正了對scnprintf的調用。)

暫無
暫無

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

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