list_entry of linked_list of linux kernel randomly value
Tengo una lista de enlaces llamada:minor_arr. el tipo del nodo es msg. Estoy tratando de añadir un nuevo nodo a la lista enlazada. el problema comienza, cuando intento leer el valor de cualquier entrada. Tengo valor al azar. ¿Alguien ve por qué?
typedef struct {
struct list_head list;
char msg_value[msg_len];
short len;
int channel_id;
} msg;
static struct list_head **minor_arr;
Y dentro del código:
char *priv_buffer;
new_msg = kcalloc(sizeof(msg), 1, GFP_KERNEL);
INIT_LIST_HEAD(&new_msg->list);
new_msg->channel_id=channel_id;//something is wrong here, can't set right channel_id
priv_buffer = new_msg->msg_value;
debug("device write before for");
printk("%zu",length);
for (i = 0; i < length; i++)
get_user(priv_buffer[i], &buffer[i]);
list_add(minor_arr[minor], &new_msg->list);
printk("A:channel id in new_msg list should be %d and it's %d",channel_id,list_entry(minor_arr[minor], msg, list)->channel_id);
return i;
algo claramente va mal como está impreso:
[ 21.704368] A:channel id in new_msg list should be 11 and it's -730005930
Pregunta hecha hace 3 años, 5 meses, 0 días - Por cyberjedi
2 Respuestas:
-
El problema parece estar en la manera en que estás accediendo y leyendo el valor de
channel_id
al intentar imprimirlo después de añadir el nuevo nodo a la lista enlazada.Cuando estás imprimiendo el valor de
channel_id
usandolist_entry
, estás accediendo al primer nodo de la listaminor_arr[minor]
en lugar del nodo recién añadidonew_msg
. Por eso estás viendo un valor aleatorio en lugar dechannel_id
adecuado.Para corregir esto, deberías imprimir el valor de
channel_id
del nodonew_msg
directamente antes de añadirlo a la lista. Así te asegurarás de que el valor sea correcto. Aquí tienes una corrección sugerida:c // Antes de añadir el nuevo nodo a la lista printk("A:channel id in new_msg should be %d", new_msg->channel_id); list_add(&new_msg->list, minor_arr[minor]); // Después de añadir el nuevo nodo a la lista printk("Channel id in new_msg list should be %d", list_entry(minor_arr[minor]->next, msg, list)->channel_id);
De esta forma, deberías ver el valor correcto de
channel_id
tanto en el nuevo nodo como en el nodo recién añadido a la lista.Respondida el Dec 18, 2020 a las 13:15 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema radica en la forma en que estás accediendo a los elementos de la lista enlazada. Estás utilizando la macro
list_entry
incorrectamente.La macro
list_entry
se utiliza para obtener un puntero a la estructura que contiene el nodo de la lista enlazada. Toma dos argumentos:Un puntero al nodo de la lista enlazada El tipo de estructura que contiene el nodo de la lista enlazada
En tu código, estás pasando un puntero a
minor_arr[minor]
como primer argumento delist_entry
.minor_arr[minor]
es un puntero a la cabeza de la lista enlazada, no a un nodo en la lista.Para obtener un puntero al nodo recién agregado, debes utilizar
new_msg
. Entonces, el código correcto debería ser:c printk("A:channel id in new_msg list should be %d and it's %d", channel_id, list_entry(new_msg, msg, list)->channel_id);
Además, en la línea:
c new_msg->channel_id=channel_id;//something is wrong here, can't set right channel_id
Estás intentando establecer el
channel_id
del nuevo mensaje, pero parece haber un error tipográfico en la línea. Debería ser:c new_msg->channel_id = channel_id;
Respondida el Dec 18, 2020 a las 13:18 - por Gemini
Votos positivos: 0 | Votos negativos: 0