Linux System Programming 學習筆記(八) 文件和目錄管理

1. 文件和元數據

每一個文件都是經過inode引用,每一個inode索引節點都具備文件系統中惟一的inode number
一個inode索引節點是存儲在Linux文件系統的磁盤介質上的物理對象,也是LInux內核經過數據結構表示的實體
inode存儲相關聯文件的元數據
 
ls -i 命令獲取文件的inode number
 
/* obtaining the metadata of a file */
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat (const char *path, struct stat *buf);
int fstat (int fd, struct stat *buf);
int lstat (const char *path, struct stat *buf);

注意:lstat函數能夠獲取 符號連接的文件元數據,lstat() returns information about the link itself and not the target filenode

struct stat {
        dev_t      st_dev;         /* ID of device containing file */
        ino_t      st_ino;         /* inode number */
        mode_t     st_mode;        /* permissions */
        nlink_t    st_nlink;       /* number of hard links */
        uid_t      st_uid;         /* user ID of owner */
        gid_t      st_gid;         /* group ID of owner */
        dev_t      st_rdev;        /* device ID (if special file) */
        off_t      st_size;        /* total size in bytes */
        blksize_t  st_blksize;     /* blocksize for filesystem I/O */
        blkcnt_t   st_blocks;      /* number of blocks allocated */
        time_t     st_atime;       /* last access time */
        time_t     st_mtime;       /* last modification time */
        time_t     st_ctime;       /* last status change time */
};

 

2. 目錄

a directory contains a list of filenames, each of which maps to an inode number. Each name is called a directory entry, and each name-to-inode mapping is called a link
當打開給定目錄中的文件,內核查詢相應的inode編號,而後將inode編號傳遞給文件系統,文件系統使用inode編號來尋找相應的存儲在物理介質中的文件
 
Reading a Directory’s Contents : 

 

/* creates a directory stream representing the directory given by name */
#include <sys/types.h>
#include <dirent.h>
DIR * opendir (const char *name);

 

/* returns the next entry in the directory represented by dir */
#include <sys/types.h>
#include <dirent.h>
struct dirent * readdir (DIR *dir);

 

/* closes the directory stream represented by dir */
#include <sys/types.h>
#include <dirent.h>
int closedir (DIR *dir);

 

/*
 * find_file_in_dir - searches the directory 'path' for a
 * file named 'file'.
 *
 * Returns 0 if 'file' exists in 'path' and a nonzero
 * value otherwise.
 */
int find_file_in_dir (const char *path, const char *file)
{
        struct dirent *entry;
        int ret = 1;
        DIR *dir;
        dir = opendir (path);
        errno = 0;
        while ((entry = readdir (dir)) != NULL) {
                if (strcmp(entry->d_name, file) == 0) {
                        ret = 0;
                        break;
                }
        }
        if (errno && !entry)
                perror ("readdir");
        closedir (dir);
        return ret;
}

 

3. 連接

each name-to-inode mapping in a directory is called a link.
Most files have a link count of 1,that is, they are pointed at by a single directory entry
當一個文件的連接計數減爲0時,文件被標記爲free,若是存在進程仍在使用此文件,則該文件將保留在文件系統中
 
Linux內核使用 a link count and a usage count 實現,一個文件只有 其link count和usage count都爲0時,纔會從文件系統移除
 
硬連接:
/* creates a new link under the path newpath for the existing file oldpath */
#include <unistd.h>
int link (const char *oldpath, const char *newpath);
成功調用以後,oldpath and newpath refer to the same file
 
符號連接(軟連接):
軟連接能夠 跨文件系統,連接到任何文件
/* creates the symbolic link newpath pointing at the target oldpath */
#include <unistd.h>
int symlink (const char *oldpath, const char *newpath);

解鏈:數據結構

#include <unistd.h>
int unlink (const char *pathname);
Once no process has the file open, it is deleted
 

4. Copying and Moving Files

 
Unix沒有提供能夠直接複製文件和目錄的系統調用
 
 copying a file src to a file named dst:
1). Open src.
2). Open dst, creating it if it does not exist, and truncating it to zero length if it does exist.
3). Read a chunk of src into memory.
4). Write the chunk to dst.
5). Continue until all of src has been read and written to dst.
6). Close dst.
7). Close src.
 

5. 塊設備

The null device lives at /dev/null. The kernel silently discards all write requests to the device. All read requests to the file return end-of-file (EOF).
The zero device lives at /dev/zero.  讀此設備返回null字符,寫此設備被丟棄
The full device lives at /dev/full.  讀此設備返回null字符,寫此設備將觸發錯誤表示設備已滿
The kernel's random number generators live at /dev/random. 
相關文章
相關標籤/搜索