Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Linux Kernel, C - niedziałające macro for_each_process()

Zielony521 22 Mar 2018 14:04 672 8
  • #1 22 Mar 2018 14:04
    Zielony521
    Poziom 5  

    Witam,
    tak jak wskazuje temat, mój problem dotyczy macro for_each_process(). Z tego co czytałem, to macro jest zdefiniowane w bibliotece linux/sched.h,
    ale nawet po załączeniu tej biblioteki do kodu, kompilator go "nie widzi" i wywala błąd - "implict declaration of function for_each_row (...)". Próbowałem też kompilować moduły pisane przez prowadzących zajęcia ale błąd nadal się pojawia, stąd moje podejrzenie że przyczyna leży poza kodem. Posiadam Ubuntu 17.04 zainstalowane na wirtualnej maszynie (VirtualBox), kompilator gcc 7.2.0. Czy macie może jakieś pomysły jak to naprawić ? Z góry dziękuję za pomoc.

    0 8
  • #2 24 Mar 2018 16:24
    trol.six
    Poziom 30  

    Zielony521 napisał:
    ale nawet po załączeniu tej biblioteki do kodu

    A jak załączasz tęże biblioteke?

    Może hasło "linux headers", będzie tym czego szukasz. Kwestia też szczegółów jak ścieżka do plików nagłówkowych, niestety nie wiem, czy trzeba ją dołączać podczas kompilacji, czy też może wystarczą ustawienia systemowe.

    0
  • #3 24 Mar 2018 17:59
    ble___
    Poziom 10  

    Jak wpisuje w google "for_each_process" znajduę taki przykłd
    https://gist.github.com/anryko/c8c8788ccf7d553a140a03aba22cab88
    i on sie u mnie nie buduje z identycznym błędem.
    Jak błąd wpiszę w google to znajduję nieco nie związane informacje o zmianach w kernelu z zeszłego roku.
    Z tego linka
    https://github.com/torvalds/linux/search?utf8=%E2%9C%93&q=for_each_process&type=
    wnioskuę że makro jest w innym pliku.
    Po dopisaniu do wspomnianego przykładu linii
    #include <linux/sched/signal.h>
    buduje się bez błędów.

    0
  • #4 05 Kwi 2018 12:12
    Zielony521
    Poziom 5  

    Przepraszam za brak odpowiedzi.
    Plik załączam tak : #include<linux/sched.h>
    Próbowałem załączyć wspomniane wcześniej linux/sched/signal.h ale wywala błąd że taki plik nagłówkowy nie istnieje. Przy załączaniu samego linux/signal.h wywala błąd że w pliku nagłówkowym jest niezdefiniowany typ danych (size_t). Zauważyłem też że (najwyraźniej) nie mam paru innych plików nagłówkowych, np. linux/rculist.h czy linux/cred.h . I teraz pytanie w jaki sposób je zainstalować ? sudo apt-get update / sudo apt-get install -f albo próba instalacji nowego gcc nic nie daje bo niby wszystko jest w porządku.

    0
  • #5 05 Kwi 2018 12:40
    JacekCz
    Poziom 35  

    Zielony521 napisał:
    ...
    Bibliotekę załączam tak : #include<linux/sched.h>
    ...


    W kwestii formalnej, załączenie nagłówków (hederów, inkludów) to nie jest załączenie biblioteki.
    W prostym przypadku jest to tylko słowna formalność, ale w skomplikowanym można się nie dogadać.

    EDIT: w C++, ze względu na realizację inline, jest często przypadek, że header==biblioteka (np mega-bilioteka boost.org). Ale w C najczęściej tak nie jest.

    0
  • #6 05 Kwi 2018 13:19
    PDT
    Poziom 24  

    Zielony521 napisał:
    ...
    Bibliotekę załączam tak : #include<linux/sched.h>
    ...

    Sprawdzaj przed użyciem jak jest w aktualnym przypadku, kernele ewaluują od wersji do wersji, czasem znacznie. Przykładowo w wersji 4.14 powinno być:
    #include <linux/sched/signal.h>

    PS ble___ już wcześniej też podał właściwą ścieżkę do pliku nagłówkowego.

    0
  • #7 05 Kwi 2018 17:47
    ble___
    Poziom 10  

    Zielony521 napisał:

    [...]Może hasło "linux headers", będzie tym czego szukasz.[...]

    Zgaduję że pomoże wywołanie
    apt-get install linux-headers-$(uname -r)
    albo
    apt-get install linux-headers-generic
    Nie wiem dlaczego wspominany na początku kod nie powodował błędów nt. braku plików (chyba że jest używany stary linux albo jest bałagan w nagłówkach).
    Jest w sieci sporo poradników specyficznych dla tej dystrybucji dotyczących pisania modułów - podejrzewam że jak uda się zbudować jakikolwiek to ten też.
    Ten przykład który wskazałem zwyczajnie zapisałem jako 2 pliki (makefile i .c z opisaną zminą), wywołałem 'make' i działało więc w razie problemów nie szukałbym ich przyczyn w kodzie.

    0
  • #8 06 Kwi 2018 12:04
    PDT
    Poziom 24  

    ble___ napisał:
    Zgaduję że pomoże wywołanie
    apt-get install linux-headers-$(uname -r)
    albo
    apt-get install linux-headers-generic ...

    Aby kompilować moduły ładowalne jądra niezbędne jest wskazanie ścieżki do skonfigurowanych źródeł kernela. Dokładnie w tej wersji dla której budujemy moduły. Również pliki nagłówkowe *.h będą poszukiwane w lokalizacji: $KDIR/include/linux, $KDIR/include/asm etc.
    Podczas kompilacji "zwykłych" programów kompilator przeszukuje lokalizacje: /usr/include/linux, /usr/include/asm etc.

    0
  • #9 11 Kwi 2018 13:58
    Zielony521
    Poziom 5  

    No cóż. Nie byłem w stanie rozwiązać problemu korzystając z Ubuntu w wersji 16.04. Instalacja starszej wersji (14.04) i zastosowanie komend :
    apt-get install linux-headers-$(uname -r)
    apt-get install linux-headers-generic
    apt-get install gcc,
    rozwiązuje problem. Dziękuję wszystkim za pomoc i dobre rady.

    0