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 № 1O 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.