《Linux程序设计》——数据管理

一、内存管理

 1、简单的内存分配

     #include<stdlib.h>

     void  *malloc(size_t  size);

     I、可以利用以上函数来分配内存。

     I、代码(P215)。


 2、分配大量内存(代码P216-217)。


 3、滥用内存(代码P219)。


 4、空指针(代码P219-220)。


 5、释放内存

     #include<stdlib.h>

     void  free(void  *ptr_to_memory);

     I、调用frre时使用的指针参数必须是指向由malloc、calloc或realloc调用所分配的内存。

 

 6、其他内存分配函数

    #include<stdlib.h>

    void  *calloc(size_t  number_of_elements,  size_t  element_size);

    void  *realloc(void  *existing_memory,  size_t  new_size);

    I、calloc函数的作用为一个结构数组分配内存,因此需要把元素个数和每个元素的大小作为指针,它所分配的内存将全部初始化为0。后续调用calloc无法保证能返回一个连

        续的空间。

    II、realloc函数用来改变先前已经分配的内存长度。它需要传递一个指向先前通过malloc,calloc或realloc调用分配的内存的指针,然后根据new_size参数的值来添加或减少

         其长度。如果无法调整内存块大小,会返回一个空指针null。



二、文件锁定

 1、文件锁定的方法

  1)、原子操作

  2)、允许锁定文件的一部分,从而可以独享对这一部分内容的访问。


 2、锁文件只是建议锁,而不是强制锁,在后者中,程序将强制锁的行为。


 3、可以利用fcntl.h头文件中定义的open系统调用,并带上O_CEAT和0_EXCL标志以原子操作(代码P223)额方式在进入临界区之前创造锁文件,然后再退出临界区用unlink

       系统调用删除锁文件(代码P224)。


 4、区域锁定

   1)、文件段锁定或文件区域锁定:文件中的某个特定部分被锁定,但其他程序可以访问这个文件中的其他部分。

   2)、实现方式:fcntl系统调用和lockf调用。fcntl和lockf的锁机制不能同时工作:它们使用不同的底层实现,因此绝不要混合使用这两种类型的调用。

   3)、fcntl函数

      #include<fcntl.h>

      int  fcntl(int  fildes,  int  command, . . .);

      I、fcntl对一个打开的文件描述符进行操作,并能根据comman参数的设置完成不同的任务。

      II、command参数:F_GETLK,F_SETLK,F_SETTLKW。

      III、但使用command参数选项时fcntl的第三个参数必须指向flock结构的指针,所以·应该使用如下函数。

      int  fcntl(int  fildes,  int  command,  struct  flock  *flock_structure);

      I、flock结构成员:short  l_type,  short  l_whence,  off_t  l_start,  off_t  l_len,  off_t  l_pid。(P227  表7-2)

        A、I_type:(P226  表7-1)

        B、I_whence、I_start、I_len成员定义了文件中的一个区域,即一个连续的字节集合。

        C、I_pid参数用来记录持有锁的进程。


 5、锁定状态下的读写操作

  1)、使用fcntl锁定文件。(代码P228-229)

  2)、测试文件上的锁。(代码P230-231)


 6、文件锁的竞争

  1)、文件锁的竞争。(代码P233-234)


 7、其他锁命令

    #include<unistd.h>

    int  lockf(int  fildes,  int  function,   off_t  size_to_lock);

    I、function参数取值:

      A、F_ULOCK(解锁)。

      B、F_LOCK(设置独占锁)。

      C、F_TLOCK(测试并设置独占锁)。

      D、F_TEST(测试其他进程设置的锁)。

   II、size_to_lock参数是操作的字节数,它从文件的当前偏移值开始计算。


 8、死锁

   1)、两个或多个程序彼此相互等待都无法继续执行下去的情况。

   2)、死锁的避免:两个或多个程序只需要使用相同的顺序来锁定它们需要的字节或规定一个更大的区域即可。



三、数据库

 1、dbm数据库的编译

   1)、情况一

          I、在C源文件中包含头文件ndbm.h。

          II、使用编译选项-I/usr/inlcude/gdbm包含目录/usr/include/gdbm。

         III、使用编译选项-lgdbm链接gdbm库。

    2)、情况二

          I、在C源文件中包含头文件gdbm-ndbm.h而不是ndbm.h。

          II、使用编译选项-I/usr/inlcude/gdbm包含目录/usr/include/gdbm。

         III、使用编译选项-lgdbm_compat  --lgdbm链接其他的gdbm兼容库。


 2、datnum数据类型

   1)、成员:void  *dptr;  size_t  dsize;datnum是一个用typedef语句定义的类型。

   2)、在使用dbm库时,如果要引用一个数据块,必须声明一个datnum类型的变量,将成员dptr指向数据的起点,并把成员dsize设为包含数据的长度。

  

 3、当打开一个数据库时,通常会创建两个物理文件,它们的后缀分别是.pag和.dir,并返回一个dbm指针,它被用来访问这两个文件。


 4、dbm访问函数

    #include<ndbm.h>

    DBM  *dbm_open(const  char  *filename,  int  file_open_flags,  mode_t  file_mode);

    int  dbm_store(DBM  *database_descriptor,  datum  key,  datnum  content,  int  store_mode);

    datum  dbm_fetch(BM  *database_escriptor,  datum  key);

    void  dbm_close(DBM  *database_descriptor);

    1)、dbm_open函数

         I、此函数用来打开已有额数据库,也可以用来创建新数据库。filename参数是一个基本文件名,它不含.pag和.dir后缀。其余的参数与open系统调用函数的第二个和第三

              个参数一样。

         II、dbm_open返回一个指向DBM类型的指针。它被用于所有后续对数据库的访问。如果失败,它将返回(DBM *)0。

    2)、dbm_store函数

        I、此函数把数据存储到数据库中。为了定义想要存储的数据和用来引用它的索引。必须设置两个datum类型的参数:一个用于引用索引,一个用于实际数据。

        II、参数store_mode用于控制当试图以一个已有的关键字来存储数据时会发生的情况。如果它被设置为dnm_insert,存储操作将失败并且dbm_store返回1.如果它被设置

              为dbm_replace,则新数据将覆盖已有数据并且dbm_store返回0.当发生其他错误时,dbm_store将返回一个负值。

    3)、dbm_fetch函数

        I、此函数用于从数据库中检索数据。它使用一个先前dbm_open调用返回的指针和一个指向关键字的datum类型结构作为其参数。

        II、此函数返回一个datum类型的结构。如果在数据库中找到与这个关键字关联的数据,返回的datum结构的dptr和size成员的值将被设置为相应数据的值。如果没有找到关

              键字,dptr将被设置为null。

    4)、此函数关闭dbm_open打开的数据库。它的参数是先前dbm_open调用返回的dbm指针。


 5、其他dbm函数

    #include<ndbm.h>

    int  dbm_delete(DBM  *database_descriptor,  datum  key);

    int  dbm_error(DBM  *database_descriptor);     

    int  dbm_clearerr(DBM  *database_descriptor);

    datum  dbm_firstkey(DBM  *database_descriptor);

    datum d  bm_nextkey(DBM  *database_descriptor);

    1)、dbm_delete函数——用于从数据库中删除数据项。它在成功时返回0。

    2)、dbm_error函数——用于测试数据库中是否有错误发生,如果没有就返回0。

    3)、dbm_clearerr函数——用于清除数据库中所有已被置位的错误发条件标志。

    4)、dbm_firstkey和dbm_nextkey函数——一般成对使用来对数据库中的所有关键字进行扫描。它需要的循环结构如下:

           DBM  *dbm_ptr;

           datum  key;

           for(key = dbm_firstkey(db_ptr);  key.dptr;  key = dbm_nextkey(db_ptr))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 嵌入式系统设计与应用是指在特定应用领域中,使用嵌入式处理器和相关硬件资源,结合嵌入式操作系统和软件开发工具,设计和开发满足特定需求的嵌入式系统。 ARM Cortex-A8是一款高性能的嵌入式处理器,广泛应用于手机、平板电脑、智能电视等嵌入式设备中。它具有强大的计算能力和低功耗特性,能够提供快速、高效的数据处理和多任务处理能力。 Linux是一种开源的嵌入式操作系统,提供了丰富的软件资源和开发工具,可以满足各种嵌入式应用的需求。在使用ARM Cortex-A8和Linux进行嵌入式系统设计和应用,可以借助Linux的强大功能和丰富的软件生态系统,快速开发出满足特定需求的嵌入式应用。 设计和开发嵌入式系统,首先需要选择合适的硬件平台和操作系统。选择ARM Cortex-A8作为处理器可以得到高性能和低功耗的优势,而选择Linux作为操作系统可以借助其丰富的软件资源和开发工具。 然后,根据具体的嵌入式应用需求,对系统进行架构设计和软件模块划分。在嵌入式系统设计中,需要考虑系统的实性、功耗控制、硬件接口与外设的驱动、应用程序的开发等方面。 在应用开发阶段,可以使用C/C++等编程语言,结合相应的开发工具,编写应用程序和驱动程序。同,可以借助Linux的丰富资源,如网络协议栈、文件系统、数据库等,快速实现系统的功能。 最后,在系统调试和测试阶段,可以使用调试工具和仿真平台进行系统性能测试和调试,以确保系统的稳定性和可靠性。 综上所述,嵌入式系统设计与应用基于ARM Cortex-A8和Linux可以提供高性能、低功耗和丰富软件资源的优势,能够快速开发出满足特定需求的嵌入式应用。 ### 回答2: 嵌入式系统设计与应用是指将计算机系统嵌入到特定的电子设备中,以完成特定的功能。基于ARM Cortex-A8和Linux的嵌入式系统设计与应用是指利用ARM Cortex-A8处理器和Linux操作系统来设计和开发嵌入式系统。 ARM Cortex-A8是一种高性能、低功耗的32位RISC处理器。它采用精简指令集架构,具有较高的运算能力和较低的能耗。Cortex-A8处理器广泛应用于嵌入式领域,可用于智能手机、平板电脑、汽车导航系统等各种嵌入式设备。 Linux是一种开源的操作系统内核,具有广泛的硬件支持和强大的软件生态系统。在嵌入式系统设计中,Linux提供了丰富的功能和驱动支持,能够提供稳定可靠的操作环境。同Linux还可以方便地进行定制和扩展,以满足各种应用需求。 在基于ARM Cortex-A8和Linux的嵌入式系统设计中,我们可以利用Linux提供的运行库、工具链以及开发环境来进行系统开发。可以利用C/C++编程语言来进行应用程序的开发,使用Linux提供的设备驱动程序来进行硬件的控制和交互。同,我们还可以利用Linux的网络支持和文件系统功能来实现网络连接和数据存储。 综上所述,基于ARM Cortex-A8和Linux的嵌入式系统设计与应用具有高性能、低功耗、可定制和可扩展等优势,可以适用于各种嵌入式设备的开发和应用。它在智能手机、平板电脑、汽车导航系统等领域具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值