2

/usr/src/linux-3.2/include/linux/unistd.hLinuxカーネルで定義された構造があります:

#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_ */

カーネルをコンパイルしてインストールし、そこから起動した後、次のプログラムをコンパイルして実行しようとします。

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

ただし、これを実行しようとすると、プログラムのコンパイルでエラーが発生します。

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

このエラーが発生する理由と解決方法を教えてください。私は Linux カーネルに非常に慣れていないため、多くの情報を見つけるのは困難です。

4

1 に答える 1

1

ファイル/usr/src/linux-3.2/include/linux/unistd.hが標準のインクルード パスにありません。

ユーザー空間アプリケーションには、独自のビルド環境があります。にあるファイルを含めています/usr/include/linux/unistd.h。内部カーネル構造のほとんどは、ユーザー空間アプリケーション用に定義されていません。

この構造を定義する必要がある場合は、ファイルを Linux ツリーからプロジェクト ディレクトリにコピーするか、-isystem/usr/src/linux-3.2/include/オプションを追加して gcc コマンドを調整する必要があります。

ただし、後者はめちゃくちゃになるので、ファイルをコピーするだけの方がよいでしょう。

于 2012-10-21T20:14:28.113 に答える