/ / Błąd podczas używania struktury zdefiniowanej w jądrze Linux-a, jądro Linux-a

Błąd przy użyciu struct zdefiniowanej w jądrze Linux - c, linux-kernel

Mam strukturę zdefiniowaną w /usr/src/linux-3.2/include/linux/unistd.h jądra Linux:

#ifndef _LINUX_UNISTD_H_
#define _LINUX_UNISTD_H_

struct threadinfo_struct {
int pid;
int nthreads;
int *tid;
};

/*
* Include machine specific syscall numbers
*/
#include <asm/unistd.h>

#endif /* _LINUX_UNISTD_H_ */

Po skompilowaniu i zainstalowaniu jądra, a następnie uruchomieniu go z niego, próbuję skompilować i uruchomić ten program:

#include <stdio.h>
#include <linux/unistd.h>
int main(void) {
struct threadinfo_struct *ti = (struct threadinfo_struct*) malloc(sizeof(struct threadinfo_struct));
// ...
return 0;
}

Jednak gdy próbuję to zrobić, pojawia się błąd w kompilacji programu:

test.c: In function "main":
test.c:4:78: error: invalid application of "sizeof" to incomplete type "struct threadinfo_struct"

Dlaczego dostaję ten błąd i jak go rozwiązać? Trudno mi znaleźć wiele informacji, biorąc pod uwagę, że jestem nowy w jądrze Linuksa.

Odpowiedzi:

1 dla odpowiedzi № 1

Plik /usr/src/linux-3.2/include/linux/unistd.h nie jest na standardowej ścieżce dołączania.

Aplikacje w przestrzeni użytkownika mają własne środowisko kompilacji. Dołączasz plik, który znajduje się w /usr/include/linux/unistd.h. Większość wewnętrznych struktur jądra nie jest zdefiniowanych dla aplikacji w przestrzeni użytkownika.

Jeśli naprawdę potrzebujesz zdefiniować tę strukturę, musisz skopiować plik z drzewa linux do katalogu projektu lub dostosować polecenie gcc, dodając -isystem/usr/src/linux-3.2/include/ opcja.

Jednak ten drugi stworzy wielki bałagan, więc lepiej po prostu skopiuj plik.