一、常用函数

fopen:
FILE *fopen(const char *filename, const char *mode);
fread:
size_t  fread(void *ptz, size_t size, size_t nitems, FILE *stream);
fwrite:
size_t fwrite(const void *ptz, size_t size, size_t nitems, FILE *stream);
fclose:
int fclose(FILE *stream);
fflush:
int fflush(FILE *stream);
fseek:
int fseek(FILE *stream, long int offset, int where);
fgetc,getc,getchar
int fgetc(FILE *stream);
int fgetc(FILE *stream);
int getchar(); //标准输入
fputc,putc,putchar
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
fgets,gets
char *fgets(char *s, int n, FILE *stream);
fputs,puts
int *fputs(char *s, FILE *stream);
int *puts(char *s);
在同级目录下建立一个文件file.in,用下面的代码实现文件拷贝(函数的参数可以使用man查找,或者参考libc文档)
#include <stdio.h>

int main(){
char c;
FILE *pin, *pout;
//open file
pin = fopen("file.in", "r");
pout = fopen("file.out", "w+");
while(c = fgetc(pin) != EOF){
fputc(c, pout);
}
fclose(pin);
fclose(pout); return 0;
}
当我们很清楚我们的物理资源和不想让一些缓存来干扰我们的时候(实时性要求高的地方)就可以使用底层的I/O操作,大部分情况下使用标准I/O操作就可以到达我们的要求。

二、文件锁定

假如有一个文件a,如果进程A在操作(修改)的时候,进程B有可能正在读文件,这样就会出现问题(有点像线程同步问题)。文件的锁定方式有文件型的记录型的两种,对文件的操作可分为独占和并发。
打开linux内核源码,可以看到内核中对文件锁如下定义
struct file_lock {
struct file_lock *fl_next; /* singly linked list for this inode */
struct list_head fl_link; /* doubly linked list of all locks */
struct list_head fl_block; /* circular list of blocked processes */
fl_owner_t fl_owner;
unsigned char fl_flags;
unsigned char fl_type;
unsigned int fl_pid;
struct pid *fl_nspid;
wait_queue_head_t fl_wait;
struct file *fl_file;
loff_t fl_start;
loff_t fl_end; struct fasync_struct * fl_fasync; /* for lease break notifications */
unsigned long fl_break_time; /* for nonblocking lease breaks */ const struct file_lock_operations *fl_ops; /* Callbacks for filesystems */
const struct lock_manager_operations *fl_lmops; /* Callbacks for lockmanagers */
union {
struct nfs_lock_info nfs_fl;
struct nfs4_lock_info nfs4_fl;
struct {
struct list_head link; /* link in AFS vnode's pending_locks list */
int state; /* state of grant or error if -ve */
} afs;
} fl_u;
};

在Linux中有强制锁和建议锁两种锁,强制锁由系统内核空间支持(和内核操作相关的函数都会判断),建议锁其实就是一个标识锁由用户空间支持(手动判断)。

可以使用 man fcntl来查看
int fcntl(int fildes, in cmd, struct flock *arg);
需要的头文件:<unistd.h><fcntl.h>
参数二cmd:
F_GETLK  //得到锁
F_SETLK  //设置锁
F_SETLKW   //设置锁并等待返回
参数三:

struct flock {
               ...
               short l_type;    /* Type of lock: F_RDLCK(共享锁),
                                   F_WRLCK(独占锁), F_UNLCK (删除锁)*/
               short l_whence;  /* How to interpret l_start:
                                   SEEK_SET, SEEK_CUR, SEEK_END */
               off_t l_start;   /* Starting offset for lock (起点)*/
               off_t l_len;     /* Number of bytes to lock(长度) */
               pid_t l_pid;     /* PID of process blocking our lock
                                   (F_GETLK only)(拥有锁的进程ID号) */
               ...
           };

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h> int main(){
//open file
int fd = open("hello", O_RDWRIO_CREAT, 0666);
if(fd > 0){
//lock file
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_pid = getpid();
int rd = fcntl(fd, F_SETLK, &lock); printf("return value of lock:%d\n", rd);
while(1){
rd++;
}
}
return 0;
}

三、错误处理

系统级调用函数失败之后会设置外部变量error的值来指明失败原因。然后可以使用perror将最新的error输出。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int main(){
int fd = open("helloworld", O_RDONL, 0666);
if(fd < 0){
perror("open error");
} return 0;
}

Android系统开发(7)——标准I/O与文件锁的更多相关文章

  1. 《Android系统开发》笔记

    <Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...

  2. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  3. Android系统开发--灯光系统之电池灯的流程分析

    Android系统开发--Android灯光系统之电池灯的流程分析 前期系统准备 运行初始化,创建系统服务 创建电池服务,获得电池灯;创建监听者监听上报电池事件: mSystemServiceMana ...

  4. Android系统开发实务实训

    实训项目 :               Android系统开发实务实训                           项目成品名称:         绝地坦克                 ...

  5. Android系统开发 编译系统签名的APP

    前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...

  6. Android 系统开发做什么?

    题外话 18 年我从 Android 应用开发转 Framework 层开发了,从此开启了 996 幸福生活,博客技术文更新基本停滞了,被工作占据了过多的精力,实在没时间像以前一样拟稿.写作,实践.反 ...

  7. Android 系统开发学习杂记(转)

    http://blog.csdn.net/shagoo/article/details/6709430 > 开发环境1.安装 Eclipse 和 android-sdk 并解压安装2.Eclip ...

  8. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  9. 浅谈Android系统开发中LOG的使用

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...

  10. TR069网管协议应用在Android系统开发的前言

    随着智能平台的终端设备不断发展,迫切需要我们解决这些终端的管理问题,而现有的终端统一管理平台已经成熟,主要是基于tr069协议网管平台,比如华为的itms等终端管理平台.所以,这篇文章就是为了实现一种 ...

随机推荐

  1. google dataflow model 论文

    http://www.chinacloud.cn/show.aspx?id=24446&cid=17

  2. ZJOI2017线段树

    ZJOI2017线段树 题意: ​ 给你一颗广义线段树,太长了,自己去看. 题解: ​ 直接上zkw那一套,把闭区间换成开区间,就是把取\([l,r]\),变成取\([l-1,l-1],[r+1,r+ ...

  3. js简易留言板

      <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="U ...

  4. 漫话Unity(二)

    三.Unity编辑器介绍 Unity是一个商业级的3d游戏引擎.一个引擎的专业程度事实上并非体如今它多么牛b 的次世代效果,说实话那些效果即便你会用也不敢用.由于没有哪个手机是次世代的. 游戏引擎的专 ...

  5. Trafodion:Transactional SQL on HBase

    Trafodion: Transactional SQL on HBase HBase上实时分布式事务处理 介绍 HBase的SQL能力一直不足.Phoenix缺乏Join能力,eBay提出的kyli ...

  6. [NOI.AC#41]最短路 线性基

    链接 题解 如果不加边,两个点之间的长度是唯一的(只能走最短路径),因为如果重复走,就异或掉了. 因此,先DFS预处理一下每个点到根的距离 \(d[x]\) ,那么 \(x,y\) 之间的距离为 $d ...

  7. php实现希尔排序(总结)

    php实现希尔排序(总结) 一.总结 1.希尔排序的算法思路:分组排序, 缩小增量排序,插入排序 2.算法思路: 循环非常好写 有几次gap:log2(n) 每次gap有几组:gap组 每组有几个元素 ...

  8. Angularjs: 封装layDate指令

    [摘要]由于业务需要,将bootstrap-datetimepicker改成了layDate. layDate是一个较成熟且便于操作的jQuery日期插件,支持同一个视图内范围选择.封装成一个指令在多 ...

  9. python ATM机 案例代码

    利用目前学的流程控制写的 ''' ATM机 需求: 1.登陆 输入账号输入密码 每日只有3次登陆密码错误的机会,超过3次禁止登陆 2.查询余额 3.存款 4.取款 5.转帐 6.退出 ''' info ...

  10. 记一些stl的用法(持续更新)

    有些stl不常用真的会忘qwq,不如在这里记下来,以后常来看看 C++中substr函数的用法 #include<string> #include<iostream> usin ...