Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android系統開發(7)——標准I/O與文件鎖

Android系統開發(7)——標准I/O與文件鎖

編輯:關於Android編程

一、常用函數

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,getcharint fgetc(FILE *stream);int fgetc(FILE *stream);int getchar(); //標准輸入fputc,putc,putcharint fputc(int c, FILE *stream);int putc(int c, FILE *stream);fgets,getschar *fgets(char *s, int n, FILE *stream);fputs,putsint *fputs(char *s, FILE *stream);int *puts(char *s);在同級目錄下建立一個文件file.in,用下面的代碼實現文件拷貝(函數的參數可以使用man查找,或者參考libc文檔)
#include 

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);需要的頭文件:
參數二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 
#include 
#include 
#include 
#include 
#include 

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 
#include 
#include 
#include 

int main(){
        int fd = open("helloworld", O_RDONL, 0666);
        if(fd < 0){
                perror("open error");
        }

        return 0;
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved