Linux系统编程(五)文件系统

文件存储

stat命令
inode和目录项
inode和目录项(2)

文件系统函数

一、stat/lstat函数(获取文件属性,从inode中获取)

int stat(const char *path, struct stat *buf);

参数:
	path: 文件路径

	buf:(传出参数) 存放文件属性。

返回值:

	成功: 0

	失败: -1 errno

符号链接穿透:stat会。lstat不会。

struct_stat
文件类型-位图

示例:获取文件属性

//stat.c
int main(int argc, char* argv[])
{
        int ret=0;
        struct stat st;
        lstat(argv[1], &st);
        printf("st_ino=%d\n",st.st_ino);
        printf("st_size=%ld\n",st.st_size);
        printf("st_mode=%x\n",st.st_mode);
        printf("st_uid=%d\n",st.st_uid);
        printf("st_gid=%d\n",st.st_gid);
        printf("st_nlink=%d\n",st.st_nlink);

        if(S_ISREG(st.st_mode))				//使用宏函数
                printf("It's a regular file\n");
        if(S_ISDIR(st.st_mode))
                printf("It's a dir file\n");
        //if(S_ISFIFO(st.st_mode))
        if((st.st_mode & S_IFMT) == S_IFIFO)		//使用宏-位图
                printf("It's a fifo file\n");     
        if(S_ISLNK(st.st_mode))
                printf("It's a link file\n");
        return 0;
}

二、mkfifo命令

mkfifo f1:创建管道文件

三、access函数

access函数

四、chomd函数

chmod函数

五、truncate函数

truncate函数

六、link/unlink函数(硬链接)

link函数

unlink函数

  • 隐式回收:当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会系统被释放。

示例1:实现mv命令

//mymv.c
int main(int argc, char* argv[])
{
        int ret=0;
        ret = link(argv[1],argv[2]);
        if(ret == -1)
        {
                perror("link error");
                exit(1);
        }
        ret = unlink(argv[1]);
        if(ret == -1)
        {
                perror("unlink error");
                exit(1);
        }
        return 0;
}

示例2:实现rm命令

myrm.c
int main(int argc, char* argv[])
{
        int ret=0;
        ret = link(argv[1],argv[2]);
        if(ret == -1)
        {
                perror("link error");
                exit(1);
        }
        ret = unlink(argv[1]);
        if(ret == -1)
        {
                perror("unlink error");
                exit(1);
        }
        return 0;
}

示例3:临时文件的使用

//unlink.c
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
	int fd, ret;
	char *p = "test of unlink\n";
	char *p2 = "after write something.\n";

	fd = open("temp.txt", O_RDWR|O_CREAT|O_TRUNC, 0644);
	if(fd < 0){
		perror("open temp error");
		exit(1);
	}

	ret = unlink("temp.txt");		 //应用:将unlink提前,即时程序崩了,也能够删除文件(临时文件)
	if(ret < 0){
		perror("unlink error");
		exit(1);
	}

	ret = write(fd, p, strlen(p));
    if (ret == -1) {
        perror("-----write error");
    }

	printf("hi! I'm printf\n");
	ret = write(fd, p2, strlen(p2));//是将内容写入到缓存中,cat命令是查看磁盘上的文件内容
    if (ret == -1) {
        perror("-----write error");
    }

    printf("Enter anykey continue\n");
    getchar();

    p[3] = 'H';//段错误

	close(fd);//fd没有被回收,会被隐式回收,程序需要退出

	return 0;
}

七、symlink函数/readlink函数(符号链接)

symlink函数

readlink函数

readlink命令

八、rename函数

rename函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值