/ / Erro ao usar struct definido no kernel do linux - c, linux-kernel

Erro ao usar a struct definida no linux kernel -c, linux-kernel

Eu tenho uma estrutura definida em /usr/src/linux-3.2/include/linux/unistd.h do kernel do 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_ */

Depois de compilar e instalar o kernel e inicializar a partir dele, tento compilar e executar este programa:

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

No entanto, quando tento fazer isso, recebo um erro na compilação do programa:

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

Por que estou recebendo esse erro e como posso resolvê-lo? É difícil para mim encontrar muitas informações, visto que sou muito novo no kernel do Linux.

Respostas:

1 para resposta № 1

O arquivo /usr/src/linux-3.2/include/linux/unistd.h não está em um caminho de inclusão padrão.

Os aplicativos de espaço do usuário têm seu próprio ambiente de construção. Você está incluindo o arquivo que está localizado em /usr/include/linux/unistd.h. A maioria das estruturas internas do kernel não são definidas para aplicativos de espaço do usuário.

Se você realmente precisa que esta estrutura seja definida, você precisa copiar o arquivo da árvore do Linux para o diretório do seu projeto, ou ajustar o comando gcc adicionando o -isystem/usr/src/linux-3.2/include/ opção.

No entanto, o último criará uma grande confusão, então é melhor apenas copiar o arquivo.