搜档网
当前位置:搜档网 › LINUX下动态链接库的创建与应用

LINUX下动态链接库的创建与应用

LINUX下动态链接库的创建与应用
LINUX下动态链接库的创建与应用

大家都知道,在windows系统中有很多的动态链接库(以.dll为后缀的文档,dll即dynamic link library)。这种动态链接库,和静态函数库不同,他里面的函数并不是执行程式本身的一部分,而是根据执行程式需要按需装入,同时其执行代码可在多个执行程式间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程式员和用户的青睐。那么,在linux 系统中有无这样的函数库呢?

??? 答案是肯定的,linux的动态链接库不但有,而且为数不少。在/lib目录下,就有许多以.so作后缀的文档,这就是linux系统应用的动态链接库,只但是和windows叫法不同,他叫so,即shared object,共享对象。(在linux下,静态函数库是以.a作后缀的) x-window 作为linux下的标准图像窗口界面,他本身就采用了很多的动态链接库(在/usr/x11r6/lib 目录下),以方便程式间的共享,节省占用空间。著名的apache网页服务器,也采用了动态链接库,以便扩充程式功能。您只需将php动态链接库拷到其共享目录,修改一下配置,apache 就能够支持php网页了。假如您愿意,能够自己编写动态链接库,让apache支持您自己定义的网页格式。这就是动态链接的好处。

1、linux下动态链接库的创建

在linux系统下,创建动态链接库是件再简单但是的事情。只要在编译函数库源程式时加上-shared选项即可,这样所生成的执行程式即为动态链接库。从某种意义上来说,动态链接库也是一种执行程式。按一般规则,程式名应带.so后缀。下面举个例子说说。

我准备编写两个函数,一个用于查询当前日期getdate,一个用于查询当前时间gettime,并将这两个函数存于动态链接库my.so中。为此,需要做以下几项工作。

1.1 编写用户接口文档datetime.h,内容如下(每行前面的数字为行号):

----------------------------------------------------------------------

1 /* datetime.h : 纵横软件制作中央雨亦奇编写, 2001-06-28. */

2

3 #ifndef __datetime_h

4

5 #define __datetime_h

6

7 /* 日期结构 */

8 typedef struct

9 {

10 int year;

11 int mon;

12 int day;

13 }datetype;

14

15 /* 时间结构 */

16 typedef struct

17 {

18 char hour;

19 char min;

20 char sec;

21 }timetype;

22

23 /* 函数原型说明 */

25 #ifdef shared

26 int (*getdate)(datetype *d);

27 #else

28 int getdate(datetype *d);

29 #endif

30

31 #ifdef shared

32 int (*gettime)(timetype *t);

33 #else

34 int gettime(timetype *t);

35 #endif

36

37 #endif

38

----------------------------------------------------------------------

这个用户接口文档中,先定义了日期和时间结构,接着定义一下函数的原型。动态函数和静态函数的原型说明不同的是,动态函数应使用(*函数名)的形式,以便引用其指针。若要引用文档中的动态函数说明,用户应该定义一下shared宏,这样才能使用。

1.2 编写getdate.c,源程式如下:

----------------------------------------------------------------------

1 /* getdate.c : 纵横软件制作中央雨亦奇编写, 2001-06-28. */

2

3 #include "time.h"

4 #include "datetime.h"

5

6 int getdate(datetype *d)

7 {

8 long ti;

9 struct tm *tm;

10

11 time(&ti);

12 tm=localtime(&ti);

13 d->year=tm->tm_year+1900;

14 d->mon=tm->tm_mon+1;

15 d->day=tm->tm_mday;

16 }

17

----------------------------------------------------------------------

在getdate函数中,先调用time取得以秒计的系统时间,再用localtime函数转换一下时间结构,最后调整得到正确的日期。

1.3 编写gettime.c,源程式如下:

----------------------------------------------------------------------

1 /* gettime.c : 纵横软件制作中央雨亦奇编写, 2001-06-28. */

3 #include "time.h"

4 #include "datetime.h"

5

6 int gettime(timetype *t)

7 {

8 long ti;

9 struct tm *tm;

10

11 time(&ti);

12 tm=localtime(&ti);

13 t->hour=tm->tm_hour;

14 t->min=tm->tm_min;

15 t->sec=tm->tm_sec;

16 }

17

----------------------------------------------------------------------

gettime函数和getdate函数相仿,先用time函数取得以秒计的系统时间,再用localtime 函数转换一下时间结构,最后返回当前的时间(不需调整)。

1.4 编写维护文档makefile-lib,内容如下:

----------------------------------------------------------------------

1 # makefile-lib : 纵横软件制作中央雨亦奇编写, 2001-06-28.

2

3 all : my.so

4

5 src = getdate.c gettime.c

6

7 tgt = $(src:.c=.o)

8

9 $(src) : datetime.h

10 @touch $@

11

12 %.o : %.c

13 cc -c $?

14

15 # 动态函数库(my.so)生成

16 my.so : $(tgt)

17 cc -shared -o $@ $(tgt)

18

----------------------------------------------------------------------

编写维护文档的目的,在于方便程式员维护程式,尤其是维护比较大的工程项目。一个素质良好的程式员应该学会熟练地编写维护文档makefile。定义了文档间的依赖关系后,一旦源文档发生变化,仅需make一下,其目标文档维护代码会自动执行,从而自动更新目标文档,减少了许多工作量。注意: 每行维护代码必须以tab(跳格键)开始,不是的话make时将出错。

本维护文档第1行是注释行,以#号开头;文档第3行定义任何需要维护的函数库;第5行定义相关源程式文档;第7行定义目标文档;第9-10行说明任何源程式依赖于datetime.h头文档,并有相应维护代码,即touch一下,更新一下源文档的时间;第12-13行定义.o文档依赖于相应的.c文档,并指定了维护代码,即用cc编译一下;第16-17行定义共享库my.so 依赖的目标文档,维护代码中用-shared编译选项,以生成动态链接库my.so。

1.5 运行make -f makefile-lib 命令

make运行后,动态链接库my.so就产生了,我们就能够在程式中调用了。假如想让系统任何用户都能够使用,则应以root用户登录系统,将这个库拷贝到/lib目录下(命令:cp my.so /lib),或在/lib目录下建个符号连接即可(命令:ln -s `pwd`/my.so /lib)。

2、linux下动态链接库的使用

2.1 重要的dlfcn.h头文档

linux下使用动态链接库,源程式需要包含dlfcn.h头文档,此文档定义了调用动态链接库的函数的原型。下面周详说明一下这些函数。

2.1.1 dlerror

原型为: const char *dlerror(void);

当动态链接库操作函数执行失败时,dlerror能够返回出错信息,返回值为null时表示操作函数执行成功。

2.1.2 dlopen

原型为: void *dlopen (const char *filename, int flag);

dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

filename: 假如名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文档。

(1) 用户环境变量中的ld_library值;

(2) 动态链接缓冲文档/etc/ld.so.cache

(3) 目录/lib,/usr/lib

flag表示在什么时候解决未定义的符号(调用)。取值有两个:

1) rtld_lazy : 表明在动态链接库的函数代码执行时解决。

2) rtld_now : 表明在dlopen返回前就解决任何未定义的符号,一旦未解决,dlopen将返回错误。

dlopen调用失败时,将返回null值,否则返回的是操作句柄。

2.1.3 dlsym : 取函数执行地址

原型为: void *dlsym(void *handle, char *symbol);

dlsym根据动态链接库操作句柄(handle)和符号(symbol),返回符号对应的函数的执行代码地址。由此地址,能够带参数执行相应的函数。

如程式代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */

add=dlsym("xxx.so","add"); /* 打开xxx.so共享库,取add函数地址 */

add(89,369); /* 带两个参数89和369调用add函数 */

2.1.4 dlclose : 关闭动态链接库

原型为: int dlclose (void *handle);

dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

2.2 在程式中使用动态链接库函数

2.2.1 程式范例

下面的程式装载了动态链接库my.so,并用getdate,gettime取得当前日期和时间后输出。----------------------------------------------------------------------

1 /************************************/

2 /* 文档名称: dy.c */

3 /* 功能描述: 动态链接库应用示范程式 */

4 /* 程式编写: 纵横软件制作中央雨亦奇 */

5 /* 编写时间: 2001-06-28 */

6 /************************************/

7

8 #include "stdio.h" /* 包含标准输入输出文档 */

9

10 #include "dlfcn.h" /* 包含动态链接功能接口文档 */

11 #define sofile "./my.so" /* 指定动态链接库名称 */

12

13 #define shared /* 定义宏,确认共享,以便引用动态函数 */

14 #include "datetime.h" /* 包含用户接口文档 */

15

16 main()

17 {

18 datetype d;

19 timetype t;

20 void *dp;

21 char *error;

22

23 puts("动态链接库应用示范");

24

25 dp=dlopen(sofile,rtld_lazy); /* 打开动态链接库 */

26

27 if (dp==null) /* 若打开失败则退出 */

28 {

29 fputs(dlerror(),stderr);

30 exit(1);

31 }

32

33 getdate=dlsym(dp,"getdate"); /* 定位取日期函数 */

34

35 error=dlerror(); /* 检测错误 */

36 if (error) /* 若出错则退出 */

37 {

38 fputs(error,stderr);

39 exit(1);

40 }

41

42 getdate(&d); /* 调用此共享函数 */

43 printf("当前日期: %04d-%02d-%02d\n",d.year,d.mon,d.day);

44

45 gettime=dlsym(dp,"gettime"); /* 定位取时间函数 */

46

47 error=dlerror(); /* 检测错误 */

48 if (error) /* 若出错则退出 */

49 {

50 fputs(error,stderr);

51 exit(1);

52 }

53

54 gettime(&t); /* 调用此共享函数 */

55 printf("当前时间: %02d:%02d:%02d\n",t.hour,t.min,t.sec);

56

57 dlclose(dp); /* 关闭共享库 */

58

59 exit(0); /* 成功返回 */

60

61 }

----------------------------------------------------------------------

程式说明:

第8行: 包含标准输入输出头文档,因为程式中使用了printf,puts,fputs等标准输入输出函数,需要让编译器根据头文档中函数的原型,检查一下语法;

第10-11行: 包含动态链接库功能头文档,并定义动态链接库名称;

第13-14行: 定义宏shared以便引用14行的头文档datetime.h中的动态函数说明;

第25行: 用dlopen打开sofile共享库,返回句柄dp;

第27-31行: 检测dp是否为空,为空则显示错误后退出;

第33行: 用dlsym取得getdate函数动态地址;

第35-40行: 假如dlerror返回值不为空,则dlsym执行出错,程式显示错误后退出;

第42-43行: 执行getdate调用,输出当前日期;

第45行: 用dlsym取得gettime函数动态地址;

第47-52行: 假如dlerror返回值不为空,则dlsym执行出错,程式显示错误后退出;

第54-55行: 执行gettime调用,输出当前时间;

第57行: 用dlclose关闭dp所指示的动态链接库;

第59行: 程式退出,返回0值。

2.2.2 编写维护文档

维护文档makefile内容如下:

----------------------------------------------------------------------

1 # makefile : 纵横软件制作中央雨亦奇编写, 2001-06-28.

2

3 all : dy

4

5 dysrc = dy.c

6

7 dytgt = $(dysrc:.c=.o)

8

9 %.o : %.c

10 cc -c $?

11

12 # 动态库应用示范程式

13 dy : $(dytgt)

14 cc -rdynamic -s -o $@ $(dytgt) -ldl

15

----------------------------------------------------------------------

维护文档说明:

第3行: 定义任何需要维护的模块;

第5行: 定义源程式;

第7行: 定义目标文档;

第9-10行: 定义.o文档依赖于.c文档,维护代码为“cc -c 变动的源文档名”;

第13-14行: 定义dy依赖于变量dytgt指示的值,维护代码中采用-rdynamic选项以指定输出文档为动态链接的方式,选项-s指定删除目标文档中的符号表,最后的选项-ldl则指示装配程式ld需要装载dl函数库。

2.2.3 运行make命令

运行make后将产生执行文档dy,运行后将产生如下类似信息:

动态链接库应用示范

当前日期: 2001-06-28

当前时间: 10:06:21

当删除my.so文档时,将出现以下信息:

动态链接库应用示范

my.so: cannot open shared object file: 文档或目录不存在

3、小结

linux创建和使用动态链接库并不是一件难事。

编译函数源程式时选用-shared选项即可创建动态链接库,注意应以.so后缀命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文档,以便其他用户共享。

使用动态链接库,源程式中要包含dlfcn.h头文档,写程式时注意dlopen等函数的正确调用,编译时要采用-rdynamic选项和-ldl选项,以产生可调用动态链接库的执行代码。

DataStageV8.5配置连接oracle操作手册

DataStageV8.5配置连接oracle 操作手册 编制:长安铃木信息系统课 王川 2012-5-7

目录 1概述 (4) 1.1编写目的 (4) 1.2系统配置 (4) 1.3事前准备 (4) 2开始安装客户端 (4) 3配置DATASTAGE 环境 (6) 4配置测试 (7)

文档版本记录 版本编号变更内容变更人日期

DataStageV8.5配置连接oracle 操作手册 1概述 1.1 编写目的 DataStage V8.5 在安装后默认支持DB2 数据库,为了实现抽取ORACLE 数据库,需要配置服务器端。 1.2 系统配置 DataStage V8.5 Suse linux server sp1 1.3 事前准备 1、安装XFTP:传递文件。 2、开启SSH服务:终端控制。 3、Oracle官网下载11g client。 https://www.sodocs.net/doc/0e8973162.html,/technetwork/database/enterprise-edition/downloads/112010-linuxsoft- 085393.html 2开始安装客户端 1、FTP上传linux_11gR2_client.zip ,并解压至TMP目录。 2、创建组和权限。 groupadd oinstall groupadd dba useradd –g oinstall –G dba –m oracle passwd oracle mkdir –p /home/oracle/ chown -R oracle:oinstall /home/oracle/ 3、修改环境配置文件。 /etc/sysctl.conf 加上如下内容 fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 536870912 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586 net.ipv4.tcp_wmem = 262144 262144 262144 net.ipv4.tcp_rmem = 4194304 4194304 4194304

centos中GIT服务器搭建及使用密钥连接

GIT服务器搭建方法,及windows下使用SSH密钥进行GIT连接 一桶咖啡20131030 1.安装CENTOS6 2.关闭SELinux #vi /etc/selinux/config 3.安装GIT #yum install git 4.创建GIT裸版本库 $cd ~ $git init --bare my.git 5.建立密钥 注意一定要在服务器端生成密钥对,因为TortoiseGit中使用的PUTTYGEN 生成的密钥格式和CENTOS中的OPENSSH使用的密钥格式不同。 在服务器上如下操作: $ cd ~ $ ssh-keygen -t rsa $ chmod 700 ~/.ssh $ cat id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys 6.使用ROOT配置SSH参数 #vi /etc/ssh/sshd_config 开启: RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 7.重新启动服务器

8.客户端安装win版GIT和TortoiseGit 下载地址: https://www.sodocs.net/doc/0e8973162.html,/p/msysgit/downloads/list?q=full+installer+official+git https://www.sodocs.net/doc/0e8973162.html,/p/tortoisegit/wiki/Download?tm=2 9.将服务器上~/.ssh/id_rsa私钥文件复制到客户端。 10.从开始菜单TortoiseGit项中找到Puttygen,点击启动该程序。 11.用Puttygen程序LOAD你下载到本地的私钥文件,后会出现格式转化的 提示。

DataStage-V11.3部署手册

DataStageV11.3 安装手册 修订记录

一、基础安装环境检查 1.操作系统Redhat Linux6需要的安装补丁包 glibc-2.12-1.107.el6.x86_64 libXp-1.0.0-15.1.el6.x86_64 libXau-1.0.5-1.el6.x86_64 libXext-1.1-3.el6.x86_64 libX11-1.3-2.el6.x86_64 libxcb-1.5-1.el6.x86_64 libXmu-1.0.5-1.el6.x86_64 nss-softokn-freebl-3.14.3-9.el6.x86_64 pam-1.1.1-4.el6_0.1.x86_64 libaio-0.3.107-10.el6.x86_64 libstdc++-4.4.7-3.el6.x86_64 compat-libstdc++-33-3.2.3-69.el6.x86_64 libgcc-4.4.7-3.el6.x86_64 2.检查操作方法 rpm –qa | grep glibc 3.授权文件配置 将授权文件解压至安装文件is-suite文件夹下

二、创建oracle数据库 1.将DataStage初始化Oracle数据库脚本上传至数据库 服务器 2.依次执行数据库初始化脚本 ./create_xmeta_db.sh sys Oracle123 orcldb dsadmin dsadmin'!'123 DATASTAGE /oracle/app/oracle/oradata/orcldb ./create_xmeta_db.sh sys Oracle123 orcldb wsadmin wsadmin'!'123 DATASTAGE1 /oracle/app/oracle/oradata/orcldb

Linux下I2C驱动介绍

1、I2C概述 I2C是philips公司提供的外设总线,I2C有两条数据线,一条是串行数据线SDA、一条是时钟线SCL,使用SDA和SCL实现了数据的交换,便于布线。I2C总线方便用在EEPROM、实时钟、小型LCD等与CPU外部的接口上。 2、Linux下的驱动思路 Linux系统下编写I2c驱动主要有两种方法:一种是把I2C当做普通字符设备来使用;另一种利用Linux下驱动的体系结构来实现。 第一种方法: 优点:思路比较直接,不用花费大量时间去了解Linux系统下I2C体系结构 缺点:不仅对I2C设备操作要了解,还有了解I2C的适配器操作 不仅对I2C设备器和设备操作需要了解,编写的驱动移植性差,内核 提供的I2C设备器都没有用上。 第二种方法: 第一种的优点就是第二种的缺点,第一种的缺点就是第二种的优点。 3、I2C框架概述 Linux的I2C体系结构分为3部分: 1)I2C核心I2C核心提供了I2C总线驱动和设备驱动的注册和注销的方法,I2C 通信方法(algorithm)上层,与具体适配器无关的代码,检测设备上层的代 码等。 2)I2C总线驱动I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可以直接受CPU来控制。 3)I2C设备驱动I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备端挂在受CPU控制的适配器上,通过I2C适配器与CPU交换数据。 Linux下的I2C体系结构: 1)Linux下的I2C体系结构 4、I2C设备驱动编写方法 首先让我们明白适配器驱动的作用是让我们能够通过它发出标准的I2C时序,在linux

内核源代码中driver/I2C/buss包含一些适配器的驱动,例如s3c2410的驱动I2C-s3c2410.c,适配器被加载到内核中,接下的任务就是实现设备驱动的编写。编写设备驱动的方法主要分为两种方法: 第一种:利用设备提供的I2C-dev.c来实现I2C适配器设备文件,然后通过上层应用程序来操作I2C设备器来控制I2C设备。 第二种:为I2C设备独立编写一个设备驱动 注意:第二种方法不能用设备提供的I2C-dev.c 5、I2C系统下的文件架构 在linux下driver下面有个I2C目录,在I2C目录下包含以下文件和文件夹 1)I2C-core.c 这个文件实现I2C核心功能以及/proc/bus/I2C*接口 2)I2C-dev.c 实现I2C适配器设备文件的功能,每个I2C适配器被分配一个设备,通过 适配器访问设备的时候,主设备号是89,此设备号是0-255. I2C-dev.c并没有针对特定设备而设计,只提供了read() write()和ioctl()等接口,应用层可以通过这些接口访问挂在适配器上的I2C设备存储空间和寄存器,并控制I2C设备的工作方式。 3)Chips 这个文件下面包含特定的I2C设备驱动。 4)Busses 这个文件包含一些I2C总线驱动。 5)Algos文件夹下实现了I2C总线适配器的algorithm 6、重要结构体 1)在内核中的I2C.h这个头文件中对I2C_driver;I2C_client;I2C_adapter和I2C_algorithm 这个四个结构体进行了定义。理解这4个结构体的作用十分关键。 i2c_adapter结构体 struct i2c_adapter { struct module *owner; //所属模块 unsigned int id; //algorithm的类型,定义于i2c-id.h, unsigned int class; const struct i2c_algorithm *algo; //总线通信方法结构体指针 void *algo_data;//algorithm数据 struct rt_mutex bus_lock; //控制并发访问的自旋锁 int timeout; int retries; //重试次数 struct device dev; //适配器设备 int nr; char name[48]; //适配器名称 struct completion dev_released; //用于同步 struct list_head userspace_clients; //client链表头

linux下编译C语言

GCC 支持了许多不同的语言,包括C、C++、Ada、Fortran、Objective C,Perl、Python 和Ruby,甚至还有Java。 Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用GCC 编译的。 编译C++程序: -c 只编译不连接 g++ file1 -c -o file1.o g++ file2 -c -o file2.o g++ file1.o file.o -o exec g++ -c a.cpp 编译 g++ -o a a.o 生成可执行文件 也可以g++ -o a a.cpp直接生成可执行文件。 1. 编译单个源文件 为了进行测试,你可以创建“Hello World”程序: #include #include int main(int argc, char **argv) { printf(“Hello world!n”); exit(0); } 使用如下命令编译并测试这个代码: # gcc -o hello hello.c

# ./hello Hello wordl! 在默认情况下产生的可执行程序名为a.out,但你通常可以通过gcc 的“-o”选项来指定自己的可执行程序名称。 2. 编译多个源文件 源文件message.c包含一个简单的消息打印函数: #include void goodbye_world(void) { printf(“Goodbye, world!n”); } 使用gcc的“-c”标记来编译支持库代码: # gcc -c message.c 这一过程的输出结果是一个名为message.o的文件,它包含适合连接到一个较大程序的已编译目标代码。 创建一个简单的示例程序,它包含一个调用goodbye_world的main函数 #include void goodbye_world(void): int main(int argc, char **argv) { goodbye_world(); exit(0); }

Git+使用教程

Git 中文教程 介绍 Git --- The stupid content tracker, 傻瓜内容跟踪器。Linus 是这样给我们介绍 Git 的。 Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。 实际上内核开发团队决定开始开发和使用 Git 来作为内核开发的版本控制系统的时候,世界开源社群的反对声音不少,最大的理由是 Git 太艰涩难懂,从 Git 的内部工作机制来说,的确是这样。但是随着开发的深入,Git 的正常使用都由一些友好的脚本命令来执行,使 Git 变得非常好用,即使是用来管理我们自己的开发项目,Git 都是一个友好,有力的工具。现在,越来越多的著名项目采用 Git 来管理项目开发,例如:wine, U-boot 等,详情看https://www.sodocs.net/doc/0e8973162.html,/git 作为开源自由原教旨主义项目,Git 没有对版本库的浏览和修改做任何的权限限制。它只适用于 Linux / Unix 平台,没有 Windows 版本,目前也没有这样的开发计划。 本文将以 Git 官方文档Tutorial,core-tutorial和Everyday GIT作为蓝本翻译整理,但是暂时去掉了对 Git 内部工作机制的阐述,力求简明扼要,并加入了作者使用 Git 的过程中的一些心得体会,注意事项,以及更多的例子。建议你最好通过你所使用的 Unix / Linux 发行版的安装包来安装 Git, 你可以在线浏览本文,也可以通过下面的命令来得到本文最新的版本库,并且通过后面的学习用 Git 作为工具参加到本文的创作中来。 $ git-clone https://www.sodocs.net/doc/0e8973162.html,/git/gittutorcn.git 创建一个版本库:git-init-db 创建一个 Git 版本库是很容易的,只要用命令git-init-db就可以了。现在我们来为本文的写作创建一个版本库: $ mkdir gittutorcn $ cd gittutorcn $ git-init-db git 将会作出以下的回应 defaulting to local storage area 这样,一个空的版本库就创建好了,并在当前目录中创建一个叫 .git 的子目录。你可以用 ls -a 查看一下,并请注意其中的三项内容: ● 一个叫 HEAD 的文件,我们现在来查看一下它的内容:

Linux下I2C驱动架构全面分析概要

Linux下I2C驱动架构全面分析 I2C概述 I2C是philips提岀的外设总线. I2C只有两条线,一条串行数据线:SDA, —条是时钟线SCL,使用SCL , SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线。 因此,I2C总线被非常广泛地应用在EEPROM,实时钟,小型LCD等设备与CPU的接口中。 linux下的驱动思路 在linux系统下编写I2C驱动,目前主要有两种方法,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux下I2C驱动体系结构来完成。下面比较下这两种方法: 第一种方法: 优点:思路比较直接,不需要花很多时间去了解linux中复杂的I2C子系统的操作方法。 缺点: 要求工程师不仅要对I2C设备的操作熟悉,而且要熟悉I2C的适配器(I2C控制器)操作。要求工程师对I2C的设备器及I2C的设备操作方法都比较熟悉,最重要的是写岀的程序可以移植性差。 对内核的资源无法直接使用,因为内核提供的所有I2C设备器以及设备驱动都是基于I2C 子系统的格式。 第一种方法的优点就是第二种方法的缺点, 第一种方法的缺点就是第二种方法的优点。 I2C架构概述 Linux的I2C体系结构分为3个组成部分: I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册,注销方法,I2C通信方法 (” algorithm 上层的,与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等。 I2C总线驱动:I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。 I2C设备驱动:I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。

Linux 下编译C程序

Linux 下编译C程序 admin , 2010/03/05 12:55 , linux , 评论(0) , 阅读(76020) , Via 本站原创 GCC 支持了许多不同的语言,包括 C、C++、Ada、Fortran、Objective C,Perl、Python 和 Ruby,甚至还有Java。 Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的。 编译C++程序: -c 只编译不连接 g++ file1 -c -o file1.o g++ file2 -c -o file2.o g++ file1.o file.o -o exec g++ -c a.cpp 编译 g++ -o a a.o 生成可执行文件 也可以 g++ -o a a.cpp直接生成可执行文件。 1. 编译单个源文件 为了进行测试,你可以创建“Hello World”程序: #include #include int main(int argc, char **argv) { printf(“Hello world! ”); exit(0); } 使用如下命令编译并测试这个代码: # gcc -o hello hello.c # ./hello Hello wordl! 在默认情况下产生的可执行程序名为a.out,但你通常可以通过 gcc 的“-o”

选项来指定自己的可执行程序名称。 2. 编译多个源文件 源文件message.c包含一个简单的消息打印函数: #include void goodbye_world(void) { printf(“Goodbye, world! ”); } 使用gcc的“-c”标记来编译支持库代码: # gcc -c message.c 这一过程的输出结果是一个名为message.o的文件,它包含适合连接到一个较大程序的已编译目标代码。 创建一个简单的示例程序,它包含一个调用goodbye_world的main函数 #include void goodbye_world(void): int main(int argc, char **argv) { goodbye_world(); exit(0); } 使用GCC编译这个程序: # gcc -c main.c 现在有了两个目标文件: message.o 和 main.o 。它们包含能够被 Linux 执行的目标代码。要从这个目标代码创建Linux可执行程序,需要再一次调用 GCC 来执行连接阶段的工作: # gcc -o goodbye message.o main.o 运行编译结果: # ./goodbye Goodbye, world! 前面这些单独的步骤也可以简化为一个命令,这是因为 GCC 对如何将多个源文件编译为一个可执行程序有内置的规则。 # gcc -o goodbye message.c main.c

如何安装Linux内核源代码

如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux 内核,另一种是内核增量补丁,它们都是tar归档压缩包。除非你有特别的原因需要使用旧版本的Linux内核,否则你应该总是升级到最新版本。 使用Git 由Linus领头的内核开发队伍从几年前就开始使用Git版本控制系统管理Linux内核了(参考阅读:什么是Git?),而Git项目本身也是由Linus创建的,它和传统的CVS不一样,Git是分布式的,因此它的用法和工作流程很多开发人员可能会感到很陌生,但我强烈建议使用Git下载和管理Linux内核源代码。 你可以使用下面的Git命令获取Linus内核代码树的最新“推送”版本: $ git clone git://https://www.sodocs.net/doc/0e8973162.html,/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 然后使用下面的命令将你的代码树与Linus的代码树最新状态同步: $ git pull 安装内核源代码 内核包有GNU zip(gzip)和bzip2格式。Bzip2是默认和首选格式,因为它的压缩比通常比gzip更好,bzip2格式的Linux内核包一般采用linux-x.y.z.tar.bz2形式的文件名,这里的x.y.z是内核源代码的具体版本号,下载到源代码包后,解压和抽取就很简单了,如果你下载的是bzip2包,运行: $ tar xvjf linux-x.y.z.tar.bz2 如果你下载的是gzip包,则运行: $ tar xvzf linux-x.y.z.tar.gz 无论执行上面哪一个命令,最后都会将源代码解压和抽取到linux-x.y.z目录下,如果你使用Git下载和管理内核源代码,你不需要下载tar包,只需要运行git clone命令,它就会自动下载和解压。 内核源代码通常都会安装到/usr/src/linux下,但在开发的时候最好不要使用这个源代码树,因为针对你的C库编译的内核版本通常也链接到这里的。 应用补丁

linux下iic(i2c)读写AT24C02

https://www.sodocs.net/doc/0e8973162.html,/jammy_lee/ https://www.sodocs.net/doc/0e8973162.html, linux下iic(i2c)读写AT24C02 linux驱动2010-02-09 16:02:03 阅读955 评论3 字号:大中小订阅 linux内核上已有iic的驱动,因此只需要对该iic设备文件进行读写则能够控制外围的iic器件。这里以AT24C02为对象,编写一个简单的读写应用程序。iic设备文件在我的开发板上/dev/i2c/0 ,打开文件为可读写。AT24C02的器件地址为0x50 ,既是iic总线上从器件的地址,每次只读写一字节数据。 /************************************************************/ //文件名:app_at24c02.c //功能:测试linux下iic读写at24c02程序 //使用说明: (1) // (2) // (3) // (4) //作者:jammy-lee //日期:2010-02-08 /************************************************************/ //包含头文件 #include #include #include #include #include #include #include

#include #include #include //宏定义 #define Address 0x50 //at24c02地址 #define I2C_RETRIES 0x0701 #define I2C_TIMEOUT 0x0702 #define I2C_SLAVE 0x0703 //IIC从器件的地址设置 #define I2C_BUS_MODE 0x0780 typedef unsigned char uint8; uint8 rbuf[8] = {0x00}; //读出缓存 uint8 wbuf[8] = {0x01,0x05,0x06,0x04,0x01,0x01,0x03,0x0d}; //写入缓存int fd = -1; //函数声明 static uint8 AT24C02_Init(void); static uint8 i2c_write(int fd, uint8 reg, uint8 val); static uint8 i2c_read(int fd, uint8 reg, uint8 *val); static uint8 printarray(uint8 Array[], uint8 Num); //at24c02初始化 static uint8 AT24C02_Init(void) { fd = open("/dev/i2c/0", O_RDWR); //允许读写 if(fd < 0) { perror("Can't open /dev/nrf24l01 \n"); //打开iic设备文件失败 exit(1);

linux下git安装使用

目的:git在linux上的安装配置包括设置不同用户的权限。 以下软件将被安装 Git Gitosis user1可以对于test仓库有读写权限,user2对于test仓库只有可读权限。 1. 增加yum repository 在CentOS中,在不增加repository情況下是找不到Git的套件的,所以需要增加一個repository。 rpm -Uvh https://www.sodocs.net/doc/0e8973162.html,/gist/centos/5/RPM/epel-release-5-3.noarch.rpm 2. 安裝Git, git-web以及gitosis yum -y install git gitweb gitosis 3. 配置Git账号 useradd git # 使用"git"作為管理Git的用戶 passwd git # 更改"git"密码 4. 配置Gitosis su - git # 使用"git"操作 cd ~ # Gitosis需要设置name和email才能进行commit动作 git config --global https://www.sodocs.net/doc/0e8973162.html, "用戶显示的名称" git config --global user.email "用戶邮件地址" ssh-keygen -t rsa # "git"用户作为Git服务器的管员, #用它來生成public key 5. 初始化Gitosis su – git gitosis-init < ~/.ssh/id_rsa.pub #Gitosis管理一个特殊的Git 仓库。你只需要在这个特殊仓库内做好相应的设定,然后推送到服务器上,Gitosis 就会随之改变运行策略. #这样该公钥的拥有者就能修改用于配置Gitosis 的那个特殊Git 仓库了。接下来,需要手工对该仓库中的post-update脚本加上可执行权限: chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update 6配置git服务选项,取出"gitosis-admin" repository su - git cd ~

实例解析linux内核I2C体系结构(2)

实例解析linux内核I2C体系结构(2) 华清远见刘洪涛四、在内核里写i2c设备驱动的两种方式 前文介绍了利用/dev/i2c-0在应用层完成对i2c设备的操作,但很多时候我们还是习惯为i2c设备在内核层编写驱动程序。目前内核支持两种编写i2c驱动程序的方式。下面分别介绍这两种方式的实现。这里分别称这两种方式为“Adapter方式(LEGACY)”和“Probe方式(new style)”。 (1)Adapter方式(LEGACY) (下面的实例代码是在2.6.27内核的pca953x.c基础上修改的,原始代码采用的是本文将要讨论的第2种方式,即Probe方式) ●构建i2c_driver static struct i2c_driver pca953x_driver = { .driver = { .name= "pca953x", //名称 }, .id= ID_PCA9555,//id号 .attach_adapter= pca953x_attach_adapter, //调用适配器连接设备 .detach_client= pca953x_detach_client,//让设备脱离适配器 }; ●注册i2c_driver static int __init pca953x_init(void) { return i2c_add_driver(&pca953x_driver); } module_init(pca953x_init); ●attach_adapter动作 执行i2c_add_driver(&pca953x_driver)后会,如果内核中已经注册了i2c适配器,则顺序调用这些适配器来连接我们的i2c设备。此过程是通过调用i2c_driver中的attach_adapter方法完成的。具体实现形式如下: static int pca953x_attach_adapter(struct i2c_adapter *adapter) { return i2c_probe(adapter, &addr_data, pca953x_detect); /* adapter:适配器 addr_data:地址信息 pca953x_detect:探测到设备后调用的函数 */ } 地址信息addr_data是由下面代码指定的。 /* Addresses to scan */ static unsigned short normal_i2c[] = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,I2C_CLIENT_END}; I2C_CLIENT_INSMOD;

linux下编写c源程序并编译运行

实验二Linux基本操作 编写c源程序并用编译运行 【需求】 在当前目录下创建新文件,用vi编辑器一段简单代码,代码要求在屏幕上输出文字“Hello Linux!”; 用gcc编译文件,并运行,查看输出结果,若结果错误,请根据提示修改; 【系统及软件环境】 操作系统:Virtualbox,Fedora 13 【实验配置文件及命令】 1.配置文件: 2

在“系统-分配光驱”里选择“” 查看安装源挂载位置 df命令,可查看到虚拟光驱挂载点 返回结果为:/media/Fedora 13 i386 DVD 使用安装源 安装的文件为RPM安装包,所在位置为安装光盘中的“Packages”目录下,可用“cd” 命令进入此目录 cd /media/ Fedora 13 i386 DVD/Packages 由于“Fedora 13 i386 DVD”名字中有空格,若直接输入,则会提示找不到此目录,可用“tab”键自动补全 【方法】cd /media/F)/P() 则可返回如下结果: cd /media/Fedora\ 13\ i386 \DVD\ /Packages 查看当前目录下是否有gcc安装包 ls |grep gcc 可返回四个结果: 4.4.4 g cc-c++4.4.4 4.4.4 4.4.4其中“4.4.4就是我们所需要的安装包 安装RPM包 【语法】rpm –ivh RPM包文件名称 即:rpm –ivh 4.4.4(此处可用tab键自动补全,即rpm –ivh gcc-4) 此时提示错误 cloog-ppl >= is needed by 4.4.4 c pp = 4.4.4 is needed by glibc-devel >= is needed by 4.4.4【原因】RPM安装包相互之间有依赖关系,需要安装依赖软件包,一共需要6个安装包,分别是kernel-headers、glibc-headers、glibc-devel、cpp、cloog-ppl和gcc 则实际安装顺序为: rpm –ivh 2.6.33 –ivh –ivh –ivh 4.4.4 –ivh --nodeps 0.15.7 –ivh 4.4.4【注意】 ①安装过程中“RPM包文件名称”注意用“tab”键减少输入 ②第“v”步安装cloog-ppl时,需带上参数“--nodeps”,因为安装此文件时所需要 的关联文件不必安装,所以用参数“--nodeps”可跳过关联检测,强制安装。 6 安装完成后,返回创建文件的test目录。使用gcc 命令来对文件进行编译。 编译完成后利用ls -l 命令查看生成的文件或者通过参数“gcc -o a”指定编译后的文件名称为a 7执行程序:./ 即可看到程序执行结果。 8 此时屏幕上会显示:Hello Linux!的字样。至此,软件的安装,程序的编写,执行 已经结束。 【实验故障与分析】

Linux操作系统的安装配置(吐血之作)

Linux操作系统的安装配置 文档记录: RedHat操作系统的安装 1.放入REDHAT ENTERPRISE LINUX 5.0安装光盘,并 设置为光盘启动。 启动成功后,如图1。输入linux text(采用文本模式)确认回车。

建议:REDHAT ENTERPRISE LINUX 5.0支持新服务器驱动,如:HP380G6 2.选择在准备安装之前是否检测光驱 一般选择SKIP跳过,开始安装,如图2:

3.选择安装过程的语言 选择English (在linux中使用Tab,切换光标的位置,使用空格键选中选项)回车,如图3: 4.选择键盘 选择US(美国键盘)回车,如图4:

5.选择安装LINUX服务代码 序列号为:2515dd4e215225dd 安装与不安装的区别: 红帽企业版的服务代码,不仅仅是升级,还包含很多售后服务和技术支持,如图5: 6.选择分区方法 选择Create custom layout,如图6:

7.分区 使用F2新建一个分区,出现图7: Mount Point :Bstarsrv1 挂接点,像/root、/bin、/etc、/usr、/home等等。 Filesystem Type:文件格式,例如windows中的fat32格式,windows 2000中的ntfs格式。Bstarsrv1中现在最常用的是

ext3、swap等。Swap是交换分区格式。 Fixed Size:自定义空间大小。 Fill all available space:使用所有可用空间 Force to be a primary partition:强制使用主分区 Check for a bad block :检测坏块 一般只需要将系统分为3个分区,同样的方法建立以下分区。/boot 启动目录100M swap 数据交换分区内存的2倍 / 根目录Fill all available space 建立数据交换分区时,不用输入挂接点,直接在File system 中,使用上下键选择swap格式,大小为内存的2倍。如图8: (根据实际调整仅供参考)下图是在8G的硬盘分区示意图9:

DataStage8.7安装文档

DataStage 8.7安装文档 官方参考: https://www.sodocs.net/doc/0e8973162.html,/infocenter/iisinfsv/v8r7/index.jsp?topic=%2Fcom.ibm.swg.im.iis.producti zation.iisinfsv.install.doc%2Ftopics%2Fwsisinst_topinstall.html 1.安装前配置 操作系统:Redhat Enterprise Linux 6.2 64位 注:由于是在Linux下安装DataStage,最好熟悉基本的linux命令的使用。 1、需要安装以下rpm包,32位和64位都需要。 glibc-2.12-1.47 libXp-1.0.0-15.1 libXau-1.0.5-1 libXext-1.1-3 libX11-1.3-2 libxcb-1.5-1 nss-softokn-freebl-3.12.9-11 libXmu-1.0.5-1 libXtst-1.0.99.2-3 libXft-2.1.13-4.1 freetype-2.3.11-6 fontconfig-2.8.0-3 libgcc-4.4.6-3 libstdc++-4.4.6-3. compat-libstdc++-33-3.2.3-69 2、关闭防火墙 关闭:service iptables stop 查看状态:service iptables status 3、禁用selinux 编辑/etc/selinux/config文件,修改SELINUX=disabled,修改后需要重启操作系统。 查看状态:sestatus 4、创建用户 groupadd -g 502 daspgrp groupadd -g 503 db2fgrp groupadd -g 504 db2igrp groupadd -g 505 dstgrp useradd -d /home/dasusr1 -m -g 502 -u 701 dasusr1 useradd -d /home/db2fenc1 -m -g 503 -u 702 db2fenc1 useradd -d /home/db2inst1 -m -g 504 -u 703 db2inst1 useradd -d /home/dsadm -m -g 505 -u 704 dsadm

boost库编译

①打开你是boost_1_37_0文件夹 ②打开tools/jam/src ③点击build.bat 稍等一下会生成一个新的文件夹,打开里面有一个bjam.exe,复制它然后将它粘 贴到boost_1_37_0文件夹里面 然后打开vc2005的命令行:开始->所有程序->visualstudio 2005->visual sudio tools->命令提示(也就是那个黑色doc的标志) (许多人用cmd 那个doc命令,许多情况下是不行的,我就试过) 假如你的boost文件夹在E:/boost_1_37_0; 那么可以这样打命令: 1 E:然后回车 2 cd boost_1_37_0 然后回车 3 bjam.exe 然后回车 你的boost库就开始编译了,时间很长~ 剩下的别人也说得较为清楚,呵呵,;-), 我玩boost很久了,从1.34开始就一直玩,很不错 4 回答者:a_xr13800 - 二级 2009-1-7 22:01 我来评论>>提问者对于答案的评价: 谢谢哦 相关内容 ? boost 1_33_1 在VC6.0上的安装出现问题 2006-12-17 ? 1.0 bar boost是什么意思 2009-2-7 ? 笔记本《上、下、左、右,》键不起作用调不成boost引导顺序,怎样装系 统啊 2010-5-12 ? 联想Y460 I3 intel turbo boost technology device驱动装不了,是什么原 因 3 2010-8-1 ? 我的主板是技嘉770t-us3 装了easy tune 6 可是找不到easy boost 2010-4-28 等待您来回答更多 ?2回答为什么不用卫星来测控嫦娥二号? ?2回答xyhhdh商业理财 ?0回答最近刚买的房子,走的是商业贷款,现交完订金,马上就去交首付款,我... ?0回答用VS2008 新建一个MFC单文档工程,菜单里的改变应用程序外观是怎么实现... ?1回答visual studio 2008 SP1里有STL吗?? ?2回答各位编程爱好者,请帮我看看这道C语言题,将中缀表达式转化为后缀表达... ?2回答请问高手,汉武大帝第七集里贵妃们玩的什么游戏???

GIT使用操作指南

GIT使用说明GIT使用说明

说明 本文档只是日常工作中一些使用步骤的简单归纳,旨在帮助大家快速用上GIT,如 有疏漏,请大家发邮件yuxiao.qiao@https://www.sodocs.net/doc/0e8973162.html,,会及时进行改进,谢谢。文档简介 1.安装支持中文文件名的Git 命令行软件包MsysGit。 2.在MsysGit 中生成用来访问Git 版本控制库的公钥数据。 3.安装Git 图形界面客户端软件TortoiseGit。 4.配置TortoiseGit。 5.在服务器中新建版本库。 6.TortoiseGit使用简介。

目录 1.安装MSYSGIT (3) 2.生成SSH 密钥 (7) 2.1.Linux系统 (7) 2.2.Windows操作系统 (8) 2.3.添加ssh文件 (9) 3.安装TORTOISEGIT (11) 4.配置TORTOISEGIT (12) 5.新建版本库 (14) 6.TORTOISEGIT使用 (15) 6.1.Clone版本库 (16) 6.2.设置参数 (17) 6.3.新增文件 (18) 6.4.修改文件 (23) 6.5.删除文件 (28)

GIT 使用指南1.安装MsysGit 1.下载安装程序,下载地址: https://www.sodocs.net/doc/0e8973162.html,/files/Git-1.8.1.2-preview20130201.exe 2.双击安装软件,进入安装页面,单击“next”,在以下页面中设置软件安装路 径。 3.配置命令行快捷方式,在安装中会出现设置如何与Windows 的文件浏览器结 合的界面,设置成“可在目录上点右键直接进入该目录的Git 命令行”,如 下图所示:

Linux_I2C总线分析(主要是probe的方式)1

Linux I2C 总线浅析 ㈠ Overview 内核空间层次! i2c adapter 是一个struct, 用来抽象一个物理i2c bus ,而且还和linux 设备驱动架构柔和在一起.. 如果只说硬件的话,就是在CPU内部集成的一个I2C控制器(提供给用户的就是那几个register),硬件上并没的所谓的adapter,client这些东东,,adapter和client都是linux 驱动软件抽象出来的东西 资料帖子: i2c_algorithm { /* If an adapter algorithm can't do I2C-level access, set master_xfer to NULL. If an adapter algorithm can do SMBus access, set smbus_xfer. If set to NULL, the SMBus protocol is simulated

using common I2C messages */ /* master_xfer should return the number of messages successfully processed, or a negative value on error */ i nt (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); i nt (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, u8 command, int size, union i2c_smbus_data *data); /* To determine what the adapter supports */ u32 (*functionality) (struct i2c_adapter *); }; /* * i2c_adapter is the structure used to identify a physical i2c bus along * with the access algorithms necessary to access it. */ struct i2c_adapter { s truct module *owner; u nsigned int id; u nsigned int class; /* classes to allow probing for */ c onst struct i2c_algorithm *algo; /* the algorithm to access the bus */ v oid *algo_data; /* data fields that are valid for all devices */ u8 level; /* nesting level for lockdep */ s truct mutex bus_lock; i nt timeout; /* in jiffies */ i nt retries; s truct device dev; /* the adapter device */ i nt nr; c har name[48]; s truct completion dev_released; }; Linux的I2C体系结构分为3个组成部分: 1·I2C核心: I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即“algorithm”)上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。这部分是与平台无关的。 2·I2C总线驱动: I2C总线驱动是对I2C硬件体系结构中适配器端的实现。I2C总线驱动主要包含了I2C适配

相关主题