Linux中常用头文件的作用
linux qmake 用法

linux qmake 用法QMake是Qt软件开发工具套件中的一个构建工具,它用于自动构建Qt项目并生成相应的构建文件。
它以简洁的语法和易于使用的方式帮助开发人员管理和组织项目代码。
在本文中,我们将介绍QMake的基本用法以及一些相关的参考内容。
1. 基本语法QMake的语法相对简洁,使用.pro文件来描述项目的构建规则。
一个典型的.pro文件包含以下几个部分:- CONFIG: 用于设置编译和构建的配置选项,比如debug、release、static、shared等。
- HEADERS: 用于指定项目中的头文件。
- SOURCES: 用于指定项目中的源代码文件。
- LIBS: 用于指定项目所依赖的第三方库。
- TARGET: 用于指定生成的可执行文件或库的名称。
- TEMPLATE: 用于指定构建的模板,可以是app、lib或subdirs。
- INCLUDEPATH: 用于指定头文件的搜索路径。
- DEPENDPATH: 用于指定依赖库的搜索路径。
- DESTDIR: 用于指定生成文件的输出目录。
- QMAKE_CXXFLAGS: 用于指定编译器的附加选项。
- QMAKE_LFLAGS: 用于指定链接器的附加选项。
2. 命令行工具QMake可以通过命令行工具进行使用和调用。
在命令行中,可以使用qmake命令来执行.pro文件并生成相应的构建文件。
例如:```qmake -o Makefile myproject.pro```这将根据myproject.pro文件生成一个名为Makefile的构建文件。
3. 变量和函数QMake支持对变量进行赋值和引用,并且提供了一些内置函数来处理和操作这些变量。
以下是一些常用的变量和函数:- equals(VAR, val): 判断变量VAR是否等于val。
- contains(VAR, val): 判断变量VAR中是否包含val。
- scope(exit, command): 在作用域结束时执行command。
linux下c语言画线函数及头文件 (1)

UNIX下c语言的图形编程--curses.h相信您在网路上一定用过如tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式的画面也较为美观. 对Programming 有兴趣的朋友一定对此感到好奇, 也许他能在PC 上用Turbo C 轻易地写出类似的程式, 然而, 但当他将相同的程式一字不变地移到工作站上来编译时, 却出现一堆抓也抓不完的错误.其实, 原因很简单, 他使用的函式库可能在UNIX 上是没有定义的. 有些在Turbo-C 上被广泛使用的一些函式, 可能在UNIX 上是不被定义的.为了因应网路上各式各样的终端机形态(terminal), UNIX 上特别发展出一套函式库, 专门用来处理UNIX 上游标移动及萤幕的显示. 这就是本篇文章要为您介绍的- curses.h 函式库. 利用这个函式库, 您也可以写出像elm 般利用方向键来移动光棒位置的程式. (CCCA 近来所提供的线上选课程式, 及程式服务界面, 即是笔者利用curses 发展而成的)■curses 的历史与版本cureses 最早是由柏克莱大学的Bill Joy 及Ken Arnold 所发展出来的.当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设计的. 因此, 利用curses 发展出来的程式将和您所使用的终端机无关.也就是说, 您不必担心您的程式因为换了一部终端机而无法使用. 这对程式设计师而言, 尤其是网路上程式的撰写, 是件相当重要的一件事.curses之所以能对上百种以上的终端机工作, 是因为它将所有终端机的资料, 存放在一个叫termcap 的资料库, ( 而在第二版的System V 系统中, 新版的curses 以terminfo 取代原来的termcap). 有了这些记录, 程式就能够知道遇到哪一种终端机时, 须送什麽字元才能移动游标的位置, 送什麽字元才能清除整个萤幕清除. (* 注一)另外, 本文的介绍以System V 的curses 版本为主.■如何在您的程式使用curses ?在您的C 程式的档头将<curses.h> include 进来.当您引进curses.h这个函式库後, 系统会自动将<stdio.h> 和<unctl.h>一并include 进来.另外, 在System V 版本中, <terminfo.h> 这个函式库也将一并include进来.#include <curses.h>main(){: :: :}当然, 您的系统内必须放有curses.h 这个函式库.■如何编译(compile)当您编辑好您的程式, 在UNIX 提示符号下键入:% /usr/5bin/cc [file.c] -lcurses^^^^^^^引进curses.h 这个library或% /usr/5bin/cc [file.c] -lcurses -ltermlib(*注二)■如何开始我的第一个curses 程式?在开始使用curses 的一切命令之前, 您必须先利用initscr()这个函式来开启curses 模式.相对的, 在结束curses 模式前( 通常在您结束程式前) 也必须以endwin()来关闭curses 模式.#include <curses.h>main(){initscr();: :: :: :endwin();}这是一般curses 程式标准的模式.此外, 您可以就您程式所须, 而做不同的设定. 当然, 您可以不做设定,而只是呼叫initscr().您可以自己写一个函式来存放所有您所须要的设定. 平常使用时, 只要呼叫这个函式即可启动curses 并完成一切设定.下面的例子, 即是笔者将平常较常用的一些设定放在一个叫initial()的函式内.void initial(){initscr();cbreak();nonl();noecho();intrflush(stdscr,FALSE);keypad(stdscr,TRUE);refresh();}各函式分别介绍如下:□initscr()initscr() 是一般curses 程式必须先呼叫的函数, 一但这个函数被呼叫之後, 系统将根据终端机的形态并启动curses 模式.□endwin()curses 通常以呼叫endwin() 来结束程式. endwin() 可用来关闭curses 模式, 或是暂时的跳离curses 模式.如果您在程式中须要call shell ( 如呼叫system() 函式) 或是需要做system call,就必须先以endwin() 暂时跳离curses 模式. 最後再以wrefresh() doupdate() 来重返curses 模式.□cbreak()nocbreak()当cbreak 模式被开启後, 除了DELETE 或CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取.当处於nocbreak 模式时, 从键盘输入的字元将被储存在buffer 里直到输入RETURN或NEWLINE.在较旧版的curses 须呼叫crmode(),nocrmode() 来取代cbreak(),nocbreak()□nl()nonl()用来决定当输入资料时, 按下RETURN 键是否被对应为NEWLINE 字元( 如\n ).而输出资料时, NEWLINE 字元是否被对应为RETURN 和LINDFEED 系统预设是开启的.□echo()noecho()此函式用来控制从键盘输入字元时是否将字元显示在终端机上.系统预设是开启的.□intrflush(win,bf)呼叫intrflush 时须传入两个值:win 为一WINDOW 型态指标, 通常传入标准输出入萤幕stdscrbf 为TRUE 或FALSE当bf 为true 时, 当输入中断字元( 如break) 时, 中断的反应将较为快速.但可能会造成萤幕的错乱.□keypad(win,bf)呼叫keypad 时须传入两个值:win 为一WINDOW 型态指标, 通常传入标准输出入萤幕stdscrbf 为TRUE 或FALSE当开启keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右等方向键, curses 会将这些特殊字元转换成curses.h 内定义的一些特殊键. 这些定义的特殊键通常以KEY_ 开头.□refresh()refresh() 为curses 最常呼叫的一个函式.curses 为了使萤幕输出入达最佳化, 当您呼叫萤幕输出函式企图改变萤幕上的画面时, curses 并不会立刻对萤幕做改变, 而是等到refresh() 呼叫後, 才将刚才所做的变动一次完成. 其馀的资料将维持不变. 以尽可能送最少的字元至萤幕上. 减少萤幕重绘的时间.如果是initscr() 後第一次呼叫refresh(), curses 将做清除萤幕的工作.■游标的控制move(y,x) 将游标移动至x,y 的位置getyx(win,y,x) 得到目前游标的位置(请注意! 是y,x 而不是&y,&x )■有关清除萤幕的函式clear()erase() 将整个萤幕清除(请注意配合refresh() 使用)■如何在萤幕上显示字元echochar(ch) 显示某个字元addch(ch) 显示某个字元mvaddch(y,x,ch) 在(x,y) 上显示某个字元相当於呼叫move(y,x);addch(ch);addstr(str) 显示一串字串mvaddstr(y,x,str) 在(x,y) 上显示一串字串相当於呼叫move(y,x);addstr(str);printw(format,str) 类似printf() , 以一定的格式输出至萤幕mvprintw(y,x,format,str) 在(x,y) 位置上做printw 的工作.相当於呼叫move(y,x);printw(format,str);■如何从键盘上读取字元getch() 从键盘读取一个字元(注意! 传回的是整数值)getstr() 从键盘读取一串字元scanw(format,&arg1,&arg2...) 如同scanf, 从键盘读取一串字元□例:int ch;char string1[80]; /* 请注意! 不可宣告为char *string1; */char string2[80];echo(); /* 开启echo 模式, 使输入立刻显示在萤幕上*/ch=getch();string1=getstr();scanw("%s",string2);mvprintw(10,10,"String1=%s",string1);mvprintw(11,10,"String2=%s",string2);■如何利用方向键curses 将一些如方向键等特殊控制字元, 以KEY_ 为开头定义在curses.h 这个档案里头, 如KEY_UP 即代表方向键的" ↑". 但, 如果您想使用curses.h 所为您定义的这些特殊键的话, 您就必须将keypad 设定为TRUE. 否则, 您就必须自己为所有的特殊键定义了.curses.h 为一些特殊键的定义如下:KEY_UP 0403 ↑KEY_DOWN 0402 ↓KEY_LEFT 0404 ←KEY_RIGHT 0405 →KEY_HOME 0406 Home key (upward+left arrow)KEY_BACKSPACE 0407 backspace (unreliable)KEY_F0 0410 Function keys.KEY_F(n) (KEY_F0+(n)) formula for f .KEY_NPAGE 0522 Next pageKEY_PPAGE 0523 Previous page以上仅列出笔者较常使用的一些控制键, 至於其他控制键的定义, 请自行参阅man curses (* 注三)一并为您列出其他常用的一些特殊字元[TAB] /t[ENTER] /r[ESC] 27[BACKSPACE] 127■如何改变萤幕显示字元的属性为了使输出的萤幕画面更为生动美丽, 我们常须要在萤幕上做一些如反白, 闪烁等变化. curses 定义了一些特殊的属性, 透过这些定义, 我们也可以在curses 程式□控制萤幕的输出变化.attron(mod) 开启属性attroff(mod) 关闭属性curses.h 里头定义了一些属性, 如:A_UNDERLINE 加底线A_REVERSE 反白A_BLINK 闪烁A_BOLD 高亮度A_NORMAL 标准模式(只能配合attrset() 使用)当使用attron() 开启某一种特殊属性模式後, 接下来在萤幕的输出都会以该种属性出现. 直到您呼叫attroff() 将此模式关闭.请注意, 当您欲attron() 开启另一种属性时, 请记得利用attroff()先关闭原来的属性, 或直接以attrset(A_NORMAL) 将所有特殊属性关闭.否则, curses 会将两种属性做重叠处理.□例:attrset(A_NORMAL); /* 先将属性设定为正常模式*/attron(A_UNDERLINE); /* 加底线*/ mvaddstr(9,10,"加底线"); /* 加底线输出一串字元*/attroff(A_UNDERLINE); /* 关闭加底线模式, 恢复正常模式*/attron(A_REVERSE); /* 开启反白模式*/ mvaddstr(10,10,"反白"); /* 输出一串反白字元*/attroff(A_REVERSE); /* 关闭反白模式, 恢复正常模式*/attron(A_BLINK); /* 开启闪烁模式*/mvaddstr(11,10,"闪烁"); /* 输出一串闪烁字元*/attroff(A_BLINK); /* 关闭闪烁模式, 恢复正常模式*/attron(A_BOLD); /* 开启高亮度模式*/ mvaddstr(12,10,"高亮度"); /* 输出一串高亮度字元*/attroff(A_BOLD); /* 关闭高亮度模式, 恢复正常模式*/■其他常用的一些函式beep() 发出一声哔声box(win,ch1,ch2) 自动画方框ch1: 画方框时垂直方向所用字元ch2: 画方框时水平方向所用字元example: box(stdscr,'|','-');将以| 及- 围成一个方框■应用完整□例下面所举的例子, 即完全利用刚刚所介绍的含式来完成.这个程式可将从键盘上读取的字元显示在萤幕上, 并且可以上下左右方向键来控制游标的位置, 当按下[ESC] 後, 程式即结束.您有没有发现, 这不就是一个简单全萤幕编辑器的雏形吗?#include <curses.h> /* 引进curses.h , 并自动引进stdio.h */#define StartX 1 /* 决定游标初始位置*/#define StartY 1void initial();main(){int x=StartX; /* 宣告x,y 并设定其初值*/int y=StartY;int ch; /* 宣告ch 为整数,配合getch() 使用*/initial(); /* 呼叫initial(), 启动curses模式, *//* 并完成其它设定*/box(stdscr,'|','-'); /* 画方框*/attron(A_REVERSE); /* 开启反白模式*/mvaddstr(0,20,"Curses Program"); /* 在(20,0) 处输出反白字元*/attroff(A_REVERSE); /* 关闭反白模式*/move(x,y); /* 将游标移至初始位置*/do { /* 以无限回圈不断等待输入*/ch=getch(); /* 等待自键盘输入字元switch(ch) { /* 判断输入字元为何*/case KEY_UP: --y; /* 判断是否"↑"键被按下*/break;case KEY_DOWN: ++y; /* 判断是否"↓"键被按下*/break;case KEY_RIGHT: ++x; /* 判断是否"→"键被按下*/break;case KEY_LEFT: --x; /* 判断是否"←"键被按下*/break;case '\r': /* 判断是否ENTER 键被按下*/++y;x=0;break;case '\t': /* 判断是否TAB 键被按下*/x+=7;break;case 127: /* 判断是否BACKSPACE 键被按下*/mvaddch(y,--x,' ');/* delete 一个字元*/break;case 27: endwin(); /* 判断是否[ESC]键被按下*/exit(1); /* 结束curses 模式*//* 结束此程式*/default:addch(ch); /* 如果不是特殊字元, 将此字元印出*/x++;break;}move(y,x); /* 移动游标至现在位置*/} while (1);}void initial() /* 自定开启curses 函式*/{initscr();cbreak();nonl();noecho();intrflush(stdscr,FALSE);keypad(stdscr,TRUE);refresh();}後记学完了上述的一些命令, 相不相信您已经可以写出一个漂亮的全萤幕编辑器了? 事实上, curses 提供的函式不下200 个, 可是笔者认为, 一切再复杂的函式都可以用本文提到的一些组合变化而成, 学了太多的函式, 只是徒增自己困扰罢了. 当然, 如果您对其它函式有兴趣, 可以自行参阅curses 说明档. ( 方法: % man curses ) 本文不过行抛砖引玉之效, 也希望未来能陆续出现更多同学自行创作的程式.* 任何疑问及建议, 欢迎e-mail 至ljh@.tw. 谢谢! *注一:请参考/usr/share/lib/termcup/usr/share/lib/terminfo/s/sun注二:1.如果是BSD 的版本, 需使用cc [file.c] -lcurses -ltermcap 来完成compile.2.计中工作站不知何故将原来的/usr/5bin/cc 更改为/usr/5bin/因此, 您若想在计中工作站compile curses 程式.需以/usr/5bin/cc.org取代/usr/5bin/cc , 否则compile 可能发生错误.3.较旧版的curses 需同时引进curses 和termlib 这两个library,因此, 您必须使用/usr/5bin/cc [file.c] -lcurses -ltermlib 来compile.注三:根据笔者的经验, 上下左右方向键应可正常使用而不会发生问题, 但其它如PgUp,PgDn,功能键,Home,End 等特殊键, 很容易因机器, 键盘不同而无法使用, 因此, 若您的程式须要在不同的机器上使用, 建议您只用方向键来控制, 其它的特殊键少用为妙.至於PgUp,PgDn 一些特殊键的控制方法, 由於较为复杂, 有兴趣的同学可参考tin 原始程式curses.c 内所使用的一些方法.。
linux sdk常用路径

linux sdk常用路径Linux SDK是开发者在Linux操作系统上进行软件开发时所使用的软件开发工具包,其中包含了一些常用的路径。
本文将介绍一些常用的Linux SDK路径,并简要说明其作用。
1. /usr/include该路径下存放了系统标准库的头文件,开发者可以在自己的代码中使用这些头文件提供的函数和数据结构。
这些头文件定义了许多常用的函数和类型,使开发者可以方便地进行编程。
2. /usr/lib这个路径下存放了系统的共享库文件,开发者在编译和链接程序时,可以使用这些共享库提供的函数和数据结构。
共享库是一种可以被多个程序共享使用的代码库,它可以减小程序的体积,提高代码的复用性。
3. /usr/bin该路径下存放了系统的可执行文件,开发者可以在终端中直接运行这些可执行文件,或者在自己的程序中调用这些可执行文件。
这些可执行文件包括系统提供的一些常用命令,如ls、cp等,以及一些开发者常用的工具,如gcc、gdb等。
4. /usr/local/include这个路径下存放了用户自定义库的头文件,开发者可以将自己编写的库的头文件放在这个路径下,以供其他程序使用。
这样做可以方便其他开发者在编写程序时使用你的库。
5. /usr/local/lib该路径下存放了用户自定义库的共享库文件,开发者可以将自己编写的库的共享库文件放在这个路径下,以供其他程序链接和使用。
这样做可以方便其他开发者在编译和链接程序时使用你的库。
6. /usr/local/bin这个路径下存放了用户自定义的可执行文件,开发者可以将自己编写的可执行文件放在这个路径下,以供自己和其他用户直接运行。
这样做可以方便其他用户使用你的程序。
7. /opt该路径下存放了一些第三方软件的安装目录,开发者可以将一些不属于系统标准库的库文件和可执行文件放在这个路径下,以供自己和其他用户使用。
这些软件通常是一些额外的工具或库,不属于系统的默认安装内容。
linuxgcc命令及用法

linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
linux的include的用法

linux的include的用法在Linux中,`include` 是一个关键字,用于在C和C++编程语言中引入头文件。
包含头文件是将预定义的函数、宏、结构和其他数据类型引入到程序中的一种方法。
头文件包含在源文件中,并在编译过程中被编译器引用。
通过包含头文件,可以在程序中使用头文件中定义的函数、宏和其他定义,而无需重新实现它们。
下面是`include` 的用法:1. `#include <header.h>`:这种形式的`include` 是用于引入系统的标准库头文件。
`<header.h>` 是标准库头文件的名称。
例如,`#include <stdio.h>` 用于引入标准输入输出函数库的头文件。
2. `#include "header.h"`:这种形式的`include` 是用于引入用户自定义的头文件。
`"header.h"` 是用户自定义头文件的名称。
例如,`#include "myheader.h"` 用于引入名为`myheader.h` 的用户自定义头文件。
在包含头文件之前,编译器会搜索系统的标准库和用户指定的目录来查找头文件。
通常,标准库的头文件通常在`/usr/include` 或`/usr/local/include` 等目录中,而用户自定义的头文件可以放在任何目录中。
需要注意的是,头文件在编译过程中只是一个引用,不会直接被执行,所以可以在程序文件中多次引用同一个头文件。
此外,还可以使用条件编译指令如`#ifndef` 和`#define` 来避免重复引用同一个头文件。
综上所述,`include` 用于在Linux中引入头文件以便在程序中使用预定义的函数、宏和其他定义。
Linux内核头文件(linux headers)

更新 Linux 内核头文件(linux headers)三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文件是比较容易的事情,在 Ubuntu/Fedora 等操作系 统上,可以直接安装相应的 linux-headers 软件包,下面就演示了在 Ubuntu 上安装内核头文件的过程。
View Code BASH1 2 3 4 5 6 7 8 9 master@jay-intel:~/workspace/c-study$ uname -r 3.2.0-33-generic master@jay-intel:~/workspace/c-study$ apt-get install linux-headers-$(uname -r) Reading package lists... Done Building dependency tree Reading state information... Done linux-headers-3.2.0-33-generic is already the newest version. linux-headers-3.2.0-33-generic set to manually installed. 0 upgraded, 0 newly installed, 0 to remove and 331 not upgraded.然而,如果自己编译 Linux kernel 并用它启动了系统,然后为了让本地程序基于当前 kernel 的 headers 来编译,就需要自己手动更新内核的头文件了。
手动更新 linux headers 的步骤如下: 1. 在 Linux kernel 目录中,执行“make headers_install”命令,将 headers 安装到当前目录的 usr/include/下面。
Linux命令行使用技巧如何使用head命令查看文件头部内容

Linux命令行使用技巧如何使用head命令查看文件头部内容head命令是Linux系统中一个常用的命令,用于查看文件的头部内容。
通过使用head命令,我们可以快速查看文件的开头部分,这在处理大文件或者日志文件时非常方便。
下面将介绍如何使用head命令以及一些常用的选项。
1. head命令的基本用法在命令行中输入以下命令即可使用head命令来查看文件的头部内容:```head [选项] [文件名]```其中,选项是可选的,用于指定head命令的不同行为。
文件名则是要查看的文件的名称。
如果不指定文件名,则默认从标准输入(键盘)读取数据。
2. 查看文件的前几行通常,我们可以通过指定-n选项来指定要查看的文件的行数。
例如,要查看文件file.txt的前10行,可以使用以下命令:```head -n 10 file.txt```这个命令将输出文件file.txt的前10行内容。
3. 默认情况下,head命令会显示文件的前10行。
如果不指定-n选项,head命令会默认显示文件的前10行。
例如,以下命令将显示file.txt的前10行内容:```head file.txt```4. 查看多个文件的头部内容head命令还可以同时查看多个文件的头部内容。
只需要在命令中指定多个文件名即可。
例如,要查看file1.txt和file2.txt的前5行内容,可以使用以下命令:```head -n 5 file1.txt file2.txt```这个命令将输出file1.txt和file2.txt的前5行内容。
5. 结合其他命令使用head命令可以与其他命令组合使用,进一步扩展其功能。
例如,我们可以使用管道符号(|)将head命令的输出作为其他命令的输入。
以下是几个示例:5.1. 使用head命令与grep命令结合,查找文件中特定内容的前几行。
例如,以下命令将查找file.txt文件中包含关键字"error"的前5行:```grep "error" file.txt | head -n 5```5.2. 使用head命令与tail命令结合,查看文件的头部和尾部内容。
linux 内核头文件 linux kernel header

inux 内核头文件linux kernel header概述:在进行有关系统软件的安装的时候(编译一个新的驱动,或者安装一个系统级别的测试工具,例如systemtap),经常需要重新编译内核,相应的问题往往与内核头文件有关。
那么,什么是内核头文件,为什么需要更新内核头文件?内核头文件作用是什么,如何更新?本文主要为你解答这些疑问。
1.内核头文件的发展历史在Linux 2.2/2.4 的纯真年代,内核头文件一直保持着Unix 世界的"KISS"传统,只需将内核源码树中的头文件直接复制到/usr/include 中即可使用,一切都是那么Simple and Stupid ...但是随着2.6 系列内核的发布,事情开始变得混乱和复杂起来。
首先是内核开发者宣布强烈反对直接使用"未净化"的"原始"内核头文件,他们建议使用发行版提供的"经过净化的"内核头文件。
于是各种发行版开始"八仙过海,各显神通",由于"净化"方法各不相同,结果就是每个发行版都有着自己与众不同的内核头文件。
更为严重的是,内核开发者甚至推荐编译Glibc 的头文件也要使用发行版提供的"经过净化的"内核头文件。
由于Glibc 和Kernel 是整个系统的根基,这样一来Linux 便像传统的Unix 那样开始走向分裂。
另一件哭笑不得的事情是,虽然内核开发者强烈推荐使用发行版提供的"经过净化的"内核头文件,但是Glibc 的开发者却不买账,他们推荐使用"未净化"的"原始"内核头文件来编译Glibc ,两个开发组一直坚持各自的见解,互不妥协!另外,两个开发组在应当由谁提供内核头文件的问题上意见也不一致:内核开发组认为应当由发行版的制作者提供,而Glibc 开发组认为应当由内核开发组提供。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux中常用头文件的作用1、Linux中一些头文件的作用:<assert.h>:ANSI C。
提供断言,assert(表达式)<glib.h>:GCC。
GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。
使用glib只需要包含<glib.h><dirent.h>:GCC。
文件夹操作函数。
struct dirent,structDIR,opendir(),closedir(),readdir(),readdir64()等<ctype.h>:ANSI C。
字符测试函数。
isdigit(),islower()等<errno.h>:ANSI C。
查看错误代码errno是调试程序的一个重要方法。
当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。
在实际编程中用这一招解决了不少原本看来莫名其妙的问题。
比较麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。
来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h <getopt.h>:处理命令行参数。
getopt()2、-------------------------linux常用头文件如下:POSIX标准定义的头文件<dirent.h> 目录项<fcntl.h> 文件控制<fnmatch.h> 文件名匹配类型<glob.h> 路径名模式匹配类型<grp.h> 组文件<netdb.h> 网络数据库操作<pwd.h> 口令文件<regex.h> 正则表达式<tar.h> TAR归档值<termios.h> 终端I/O<unistd.h> 符号常量<utime.h> 文件时间<wordexp.h> 字符扩展类型-------------------------<arpa/inet.h> INTERNET定义<net/if.h> 套接字本地接口<netinet/in.h> INTERNET地址族<netinet/tcp.h> 传输控制协议定义-------------------------<sys/mman.h> 内存管理声明<sys/select.h> Select函数<sys/socket.h> 套接字借口<sys/stat.h> 文件状态<sys/times.h> 进程时间<sys/types.h> 基本系统数据类型<sys/un.h> UNIX域套接字定义<sys/utsname.h> 系统名<sys/wait.h> 进程控制------------------------------POSIX定义的XSI扩展头文件<cpio.h> cpio归档值<dlfcn.h> 动态链接<fmtmsg.h> 消息显示结构<ftw.h> 文件树漫游<iconv.h> 代码集转换使用程序<langinfo.h> 语言信息常量<libgen.h> 模式匹配函数定义<monetary.h> 货币类型<ndbm.h> 数据库操作<nl_types.h> 消息类别<poll.h> 轮询函数<search.h> 搜索表<strings.h> 字符串操作<syslog.h> 系统出错日志记录<ucontext.h> 用户上下文<ulimit.h> 用户限制<utmpx.h> 用户帐户数据库-----------------------------<sys/ipc.h> IPC(命名管道)<sys/msg.h> 消息队列<sys/resource.h>资源操作<sys/sem.h> 信号量<sys/shm.h> 共享存储<sys/statvfs.h> 文件系统信息<sys/time.h> 时间类型<sys/timeb.h> 附加的日期和时间定义<sys/uio.h> 矢量I/O操作------------------------------POSIX定义的可选头文件<aio.h> 异步I/O<mqueue.h> 消息队列<pthread.h> 线程<sched.h> 执行调度<semaphore.h> 信号量<spawn.h> 实时spawn接口<stropts.h> XSI STREAMS接口<trace.h> 事件跟踪3、C/C++头文件一览C#include <assert.h>//设定插入点#include <ctype.h>//字符处理#include <errno.h>//定义错误码#include <float.h>//浮点数处理#include <iso646.h> //对应各种运算符的宏#include <limits.h>//定义各种数据类型最值的常量#include <locale.h>//定义本地化C函数#include <math.h>//定义数学函数#include <setjmp.h> //异常处理支持#include <signal.h> //信号机制支持#include <stdarg.h> //不定参数列表支持#include <stddef.h> //常用常量#include <stdio.h>//定义输入/输出函数#include <stdlib.h>//定义杂项函数及内存分配函数#include <string.h>//字符串处理#include <time.h>//定义关于时间的函数#include <wchar.h>//宽字符处理及输入/输出#include <wctype.h>//宽字符分类传统C++#include <fstream.h>//改用<fstream>#include <iomanip.h>//改用<iomainip>#include <iostream.h>//改用<iostream>#include <strstrea.h>//该类不再支持,改用<sstream>中的stringstream ————————————————————————————————标准C++#include <algorithm>//STL 通用算法#include <bitset>//STL 位集容器#include <cctype> //字符处理#include <cerrno> //定义错误码#include <cfloat>//浮点数处理#include <ciso646> //对应各种运算符的宏#include <climits> //定义各种数据类型最值的常量#include <clocale> //定义本地化函数#include <cmath> //定义数学函数#include <complex>//复数类#include <csignal> //信号机制支持#include <csetjmp> //异常处理支持#include <cstdarg> //不定参数列表支持#include <cstddef> //常用常量#include <cstdio> //定义输入/输出函数#include <cstdlib> //定义杂项函数及内存分配函数#include <cstring> //字符串处理#include <ctime> //定义关于时间的函数#include <cwchar> //宽字符处理及输入/输出#include <cwctype> //宽字符分类#include <deque>//STL 双端队列容器#include <exception>//异常处理类#include <fstream> //文件输入/输出#include <functional>//STL 定义运算函数(代替运算符)#include <limits> //定义各种数据类型最值常量#include <list>//STL 线性列表容器#include <locale> //本地化特定信息#include <map>//STL 映射容器#include <memory> //STL通过分配器进行的内存分配#include <new> //动态内存分配#include <numeric> //STL常用的数字操作#include <iomanip> //参数化输入/输出#include <ios>//基本输入/输出支持#include <iosfwd>//输入/输出系统使用的前置声明#include <iostream> //数据流输入/输出#include <istream>//基本输入流#include <iterator> //STL迭代器#include <ostream>//基本输出流#include <queue>//STL 队列容器#include <set>//STL 集合容器#include <sstream>//基于字符串的流#include <stack>//STL 堆栈容器#include <stdexcept>//标准异常类#include <streambuf>//底层输入/输出支持#include <string>//字符串类#include <typeinfo> //运行期间类型信息#include <utility>//STL 通用模板类#include <valarray> //对包含值的数组的操作#include <vector>//STL 动态数组容器————————————————————————————————C99增加的部分#include <complex.h>//复数处理#include <fenv.h>//浮点环境#include <inttypes.h>//整数格式转换#include <stdbool.h>//布尔环境#include <stdint.h>//整型环境#include <tgmath.h>//通用类型数学宏。