[linux程序设计笔记]第7章:数据管理(省略了后面的数据库那个)

本文深入探讨了内存管理中的内存分配与释放机制,以及文件锁定技术的应用场景与实现方式,包括使用malloc/free进行内存操作,以及如何通过锁文件和文件锁实现对文件的不同级别的封锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据管理

A 内存:
  1. 内存的分配:
    (void *) malloc(size_t size)
    size_t在32位机上被解释为unsiged int,size是分配的内存大小(按字节算)。
    返回的是空指针。你可以用任意方式操作这段内存。接收变量会记录其首地址,并规定操作方式。
    如:
       char * s;
       s=(char *) malloc(sizeof(char));    //刚好分配一个字节,并用char的方式操作。s变量映射到首地址
       s=(char *) malloc(1024);            //分配1KB的内存,并用s指向第一个字节。
       s++;                                //将s指向的地址向前移动。

   2. 内存的释放:
     void free(void * ptr_to_memory);
     问题是:如果我使得内存指针+1之后,再释放s,那么内存是否完全被释放掉?


B  文件:
   1.锁文件:
        适用:对整个文件进行封锁。
        方式:需要封锁某个文件的时候,测试并创建一个临时文件的锁文件。如果存在则失败,否则则创建成功。
        实现:open带O_CREAT和O_EXCL参数,如果文件已经存在,创建会失败,同时在最后unlink掉这个tmp文件。
 
    2.文件锁:
        适用:对于一个大型文件的某些区域进行封锁。
        方式:对文件中的某些位置进行设置,利用ftcnl、flock完成。包括读锁,写锁,解除锁。
        实现:
             a 文件锁结构体flock: 
                  l_type  :包括F_RDLCK、F_WRlCK、F_UNLCK
                  l_Whence: 包括SEEK_SET、SEEK_CUR或SEEK_END;
                  l_start : 开始位置(以字节算)
                  l_len   : 封锁长度(以字节算)
                  l_pid   :拥有锁进程的标识代码
              
              b fcntl函数
                  int fcntl(int fildes,int command,....);
                  一般调用形式: res=fcntl(fileID,F_GETLK,&flock);
                                res=fcntl(fileID,F_SETLK,&flock);
                  其中
                      F_GETLK:用来打开文件的封锁信息。它不会对文件进行封锁。
                               它给出想要封锁的区域,如果文件目前的封锁状态不允许调用者
                               封锁文件,则会将信息覆盖掉原来的flock,如果调用者申请的封锁
                               信息能够被成功设置,则flock结构保持不变。
                               调用成功,fcntl返回不是-1的值。此时需要检查flcok是否被修改。
                               因为一般这种情况会把l_pid设置为-1,所以检查这一位就可以了。
                       F_SETLK:
                               对某个区域进行封锁,这个时候没有l_pid。
                               成功返回不是-1的值,失败返回-1.
                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值