umask函数,文件长度st_size,文件截断函数truncate ftruncate(文件属性)【linux】(r)

umask函数

open函数创建新文件时的一个问题
open函数创建新的文件时,如果指定的是0777满级权限的话,实际创建文件权限为0775(rwxrwxr-x)

我们通过代码进行演示:

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
        int fd = 0;
        fd = open("umask.txt",O_RDWR|O_CREAT,0777);
        if(-1 == fd)
        {
                printf("open fail\n");
                exit(-1);
        }
        return 0;
}

执行结果为:
在这里插入图片描述

我们可以看到给的是满权限,但是实际上是0775为什么不是满级权限?
因为被文件权限掩码做了限制。文件权限掩码是默认就有的,每一个进程运行起来的时候都有一个文件权限掩码。默认是002 这是系统给的。

写入的权限 111 111 111 (0777)
文件权限掩码000 000 010 (0002)
文件权限掩码取反111 111 101
写入的权限与文件权限掩码取反之后的结果求&
结果为:111 111 101 (0775 :rwxrwxr-x)

限制其他用户写权限,防止其它用户修改你的文件,如果确实有创建满级权限的需求的话,就必须将文件权限掩码002修改为0 ,当然如果觉得文件限制权限太小了,也同样进行掩码修改那么在写入权限的时候也是通过上面的方法进行写入操作,怎么将文件权限掩码改为0,使用umask函数即可。

函数原型和所需头文件

#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);

功能
修改文件权限掩码

参数
mask:新的文件权限掩码

返回值
umask不会调用失败。
返回值是旧的文件权限掩码。

代码演示:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
        int fd = 0;
        mode_t ret = 0;
        //保存旧的文件权限掩码并且修改文件权限掩码
        ret = umask(0);
        printf("olsUmask = %d\n",ret);
        fd = open("umask.txt",O_RDWR|O_CREAT,0777);
        if(-1 == fd)
        {
                printf("open fail\n");
                exit(-1);
        }       
        return 0;
}

我们先删除之前已经创建的umask.txt文件
执行结果为:
在这里插入图片描述

我们查看以下umask.txt的文件权限:

在这里插入图片描述

我们可以看到现在的umask.txt就是满权限。

文件长度st_size

我们前面学习struct stat结构体时,这个结构体中的st_size被用来存放文件长度,但是这一项只对普通文件、目录、以及符号连接文件有意义。

因为只有普通文件、目录、以及符号链接文件才有实际的数据,有数据才有文件长度。

其它的文件在块设备上只存储了文件属性,它们只是挂了一个文件名,以文件的形式进行管理而已,没有实际的数据,所以对于这些文件来说,文件大小是没有意义的。

符号链接文件的文件大小
符号链接文件就是一个快捷文件,背后指向了某个文件。
符号链接文件的数据,就是所指向文件的文件名,所以它的文件大小指的就是这个名字的字符个数。

pfile -> file.txt

文件截断函数truncate ftruncate

我们学习open时,可以指定了O_TRUNC后,文件里面有数据的话,会将打开的文件截短(清空)为0,在这里我们说明一个文件截短的函数truncate,它不仅能够将文件截为0,还可以把文件截短为任意长度。

函数原型和所需头文件

#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
	int ftruncate(int fd, off_t length);

函数功能
将文件长度截短为length所指定长度。
truncate利用文件路径名操作,ftruncate利用文件描述符操作。

函数返回值:成功返回0,失败返回-1,errno被设置

代码演示:
我们先给umask.txt文件写入数据:
在这里插入图片描述

代码为:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
        //将umask.txt文件大小截断为10
        truncate("umask.txt",10);
        return 0;
}

执行结果为:
在这里插入图片描述 我们可以看到文件里面剩下的10个字符。

ftruncate 函数是同通过文件描述符来操作的,我们进行代码演示:

#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
        int fd = 0;
        fd = open("umask.txt",O_RDWR|O_CREAT,0777);
        if(-1 == fd)
        {
                printf("open fail\n");
                exit(-1);
        }
        ftruncate(fd,5);
        return 0;
}

执行结果为:

在这里插入图片描述我们可以看到文件里面剩下的5个字符。
查看文件大小:在这里插入图片描述

文件大小为5

那么我们可以可以把文件从小变成大呢。

我们进行代码测试:

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
        int fd = 0;

        fd = open("umask.txt",O_RDWR|O_CREAT,0777);
        if(-1 == fd)
        {
                printf("open fail\n");
                exit(-1);
        }
        ftruncate(fd,20);
        return 0;
}

执行结果为:
在这里插入图片描述

我们可以看到是可以的。
我们打开文件:umask.txt文件
在这里插入图片描述

超过的这一段表示是空洞,关于空洞我们在下一篇博客进行说明。

发布了84 篇原创文章 · 获赞 71 · 访问量 9090

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104243023