• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mały błąd w kodzie C - Linux - Moduły

VPS Starter Arubacloud
0 głosów
145 wizyt
pytanie zadane 24 listopada 2019 w Systemy operacyjne, programy przez gorgonkowa Obywatel (1,810 p.)

Hejka. Mam mały problem. Dotyczy on kodu w języku C.

Kod:

#include <linux/module.h>
#include <linux/kfifo.h>

#define NUMBER_OF_ELEMENTS 16

static struct kfifo kolejka;

int i;
u32 wartosc;
unsigned int rozmiar, dl;

static int __init fifoinit(void)
{
        int w1;
        pr_notice("_________________________________________________________");
        w1=kfifo_alloc(&kolejka,NUMBER_OF_ELEMENTS*sizeof(wartosc),GFP_KERNEL);
        if(w1) {
                pr_alert("Blad alokowania!\n");
                return -ENOMEM;
        }
        while(!kfifo_is_full(&kolejka)){
                for(i=1; i<=5; i++){
                        wartosc=i;
                        kfifo_in(&kolejka,&wartosc,sizeof(wartosc));
                }
        }
        rozmiar=kfifo_size(&kolejka);
        dl=kfifo_len(&kolejka);
        pr_notice("rozmiar kolejki: %u, zajete miejsce: %u\n",rozmiar,dl);
        pr_notice("wartosc: %u", wartosc);
        kfifo_out(&kolejka,&wartosc,sizeof(wartosc));
        while(!kfifo_is_full(&kolejka))
        {
                for(i=6; i<=16; i++) {
                        wartosc=i;
                        kfifo_in(&kolejka,&wartosc,sizeof(wartosc));
                }
        }
        return 0;
}

static void __exit fifoexit(void)
{
        rozmiar=kfifo_size(&kolejka);
        dl=kfifo_len(&kolejka);
        pr_notice("rozmiar kolejki: %u, zajete miejsce: %u\n",rozmiar,dl);
        for(i=1;i<=16;i++){
                pr_notice("element %i: %u",i,wartosc);
                kfifo_out(&kolejka,&wartosc,sizeof(wartosc));
        }
        kfifo_free(&kolejka);
}


module_init(fifoinit);
module_exit(fifoexit);

Włączając program na maszynie wirtualnej, błędów w kodzie nie ma, ale wyświetla się niepoprawnie. To znaczy... że wyświetla się wszystko w kolejce w taki sposób, jak poniżej. Jednakże, nie wiem, jak zmienić pierwszy element, żeby nie wyświetlało "16", tylko "1"? To pewnie jakaś drobnostka, której niestety nie widzę... To są wyniki
- element 1: 16
- element 2: 3
- element 3: 4
- element 4: 5
- element 5: 6
- element 6: 1
- element 7: 2
- element 8: 3
- element 9: 4
- element 10: 5
- element 11: 6
- element 12: 1
- element 13: 2
- element 14: 3
- element 15: 4
- element 16: 5
- Rozmiar kolejki: 64, zajęta pamięć 64

Polecenie do tego kodu brzmi:

Napisać moduł, który tworzy kolejkę FIFO dla liczb 32 bitowych bez znaku. Maksymalny rozmiar kolejki to 16 elementów. W szczególności należy:

  • Podczas inicjowania modułu dodać do kolejki 5 elementów (każdy ma otrzymać kolejny numer porządkowy od 1 do 5), następnie wyświetlić rozmiar kolejki (całkowity) i ilość zajętego miejsca, usunąć jeden element (przed usunięciem wydrukować go) i dodać 15 kolejnych (kontynuując numerację - czyli zacząć od 6).
  • W funkcji usuwającej moduł: wyświetlić rozmiar kolejki (całkowity) i ilość zajętego miejsca. Usunąć wszystkie elementy wyświetlając podczas usuwania ich wartości. Usunąć kolejkę.
  • Przeanalizować logi systemowe. Zinterpretować wyniki szczególnie dotyczące rozmiaru kolejki (całkowitego) i ilości zajętego miejsca.

    Będę bardzo wdzięczna za wskazanie błędu w moim kodzie. :)
1
komentarz 24 listopada 2019 przez j23 Mędrzec (195,220 p.)
Zła kategoria pytania. Daj je do C/C++.

1 odpowiedź

0 głosów
odpowiedź 25 listopada 2019 przez mokrowski Mędrzec (156,260 p.)
#include <linux/module.h>
#include <linux/kfifo.h>

#define NUMBER_OF_ELEMENTS 16

static struct kfifo kolejka;

#define DYNAMIC

static int __init fifoinit(void)
{
	u32 wartosc;
	int w1;
	pr_notice("_________________________________________________________");
	w1 = kfifo_alloc(&kolejka, NUMBER_OF_ELEMENTS * sizeof(wartosc),
			 GFP_KERNEL);
	if (w1) {
		pr_alert("Blad alokowania!\n");
		return -ENOMEM;
	}
	for (wartosc = 1; (wartosc <= 5) && (!kfifo_is_full(&kolejka));
	     ++wartosc) {
		kfifo_in(&kolejka, &wartosc, sizeof(wartosc));
	}
	pr_notice("dlugosc kolejki: %u bajtow, zajete miejsce: %u bajtow\n",
		  kfifo_len(&kolejka), kfifo_size(&kolejka));
	kfifo_peek(&kolejka, &wartosc);
	pr_notice("wartosc: %u", wartosc);
	kfifo_out(&kolejka, &wartosc, sizeof(wartosc));
	for (wartosc = 6; wartosc <= 16; ++wartosc) {
		kfifo_in(&kolejka, &wartosc, sizeof(wartosc));
	}
	return 0;
}

static void __exit fifoexit(void)
{
	u32 wartosc;
	int i;
	pr_notice("dlugosc kolejki: %u, zajete miejsce: %u\n",
		  kfifo_len(&kolejka), kfifo_size(&kolejka));
	for (i = 1; !kfifo_is_empty(&kolejka); ++i) {
		kfifo_out(&kolejka, &wartosc, sizeof(wartosc));
		pr_notice("element %i: %u", i, wartosc);
	}
	kfifo_free(&kolejka);
}

module_init(fifoinit);
module_exit(fifoexit);

Tylko opróżnij bufor (flush) kernela. Bo ostatni komunikat zobaczysz dopiero po opróżnieniu.

PS. Lepiej stosować zmienne automatyczne bo nie będzie problemów np. z wielowątkowym użyciem modułu

A.. i zwróć uwagę na definicję DYNAMIC. Nie wiem czy chodziło o dynamiczne zarządzanie wielkością kolejki (ale zakładam że tak).

Podobne pytania

–3 głosów
1 odpowiedź 475 wizyt
0 głosów
3 odpowiedzi 2,897 wizyt

93,018 zapytań

141,984 odpowiedzi

321,283 komentarzy

62,364 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...