linux系统函数学习_(5)access函数、chmod函数、chown函数、truncate函数、rename函数及链接相关函数

本文详细介绍了Linux系统中的几个关键函数,包括access()用于测试文件权限,chmod()用于改变文件权限,chown()用于更改文件所有者,truncate()用于调整文件大小,以及rename()用于文件重命名。同时,还提到了链接相关函数如link()、symlink()、readlink()和unlink()的功能和使用场景。

linux系统函数学习_(5)access函数、chmod函数、chown函数、truncate函数、rename函数及链接相关函数

access()函数

作用: 测试指定文件是否拥有某种权限
原型: int access(const char *pathname, int mode);
参数:
pathname->文件名
mode->权限类别:R_OK是否有读权限、W_OK是否有写权限、X_OK是否有执行权限、F_OK测试一个文件是否存在
返回值:
0->所有欲查核的权限都通过了检查 -1->有权限被禁止

// access.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        printf("a.out filename\n");
        exit(1);
    }

    int ret = access(argv[1], W_OK);
    if(ret == -1)
    {
        perror("access");
        exit(1);
    }
    printf("you can write this file.\n");
    return 0;
}

chmod()函数

作用: 改变文件的权限
原型: int chmod(const char *filename, int pmode);
参数:filename->文件名 pmode->权限:必须是一个8进制数
返回值:0->改变成功 -1->失败

// chmod.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        printf("a.out filename\n");
        exit(1);
    }

    int ret = chmod(argv[1], 0755);
    if(ret == -1)
    {
        perror("chmod");
        exit(1);
    }
    return 0;
}

chown()函数

作用: 改变文件的所有者,chown()会将参数path指定文件的所有者变更为参数owner代表的用户,而将该文件的组变更为参数group 组。如果参数owner 或group 为-1,对应的所有者或组不会有所改变。
原型: int chown(const char *path, uid_t owner, gid_t group);
返回值:0->成功 -1->失败

// chown.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        printf("a.out filename!\n");
        exit(1);
    }

    // user->ftp  group->ftp
    int ret = chown(argv[1], 116, 125);
    if(ret == -1)
    {
        perror("chown");
        exit(1);
    }
    return 0;
}

truncate()函数

作用: 将参数path指定的文件大小改为参数length指定的大小。如果原来的文件大小比参数length大,则超过的部分会被删去。
原型: int truncate(const char *path, off_t length);
返回值:0->成功 -1->失败

// truncate.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char* argv[])
{
    if(argc < 3)
    {
        printf("a.out filename 111\n");
        exit(1);
    }

    long int len = strtol(argv[2], NULL, 10); 
    int  aa = truncate(argv[1], len);
    if(aa == -1)
    {
        perror("truncate");
        exit(1);
    }
    return 0;
}

rename()函数

作用: 文件重命名
原型: int rename(const char *oldpath, const char *newpath);
返回值:0->成功 -1->失败

// rename.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    if(argc < 3)
    {
        printf("a.out oldName newName\n");
        exit(1);
    }

    int ret = rename(argv[1], argv[2]);
    if(ret == -1)
    {
        perror("rename");
        exit(1);
    }
    return 0;
}

链接

link() 函数- -作用:创建一个硬链接;原型: int link(const char *oldpath, const char *newpath);

// link.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    if(argc < 3)
    {
        printf("a.out oldpath newpath\n");
        exit(0);
    }

    int ret = link(argv[1], argv[2]);
    if(ret == -1)
    {
        perror("link");
        exit(1);
    }
    return 0;
}

symlink() 函数- -作用:创建一个软链接

// symlink.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    if(argc < 3)
    {
        printf("a.out oldpath newpath\n");
        exit(1);
    }

    int ret = symlink(argv[1], argv[2]);
    if(ret == -1)
    {
        perror("symlink");
        exit(1);
    }

    return 0;
}

readlink() 函数- -作用:读取软连接对应的文件名,不是读内容

// readlink.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        printf("a.out softlink\n");
        exit(1);
    }

    char buf[512];
    int ret = readlink(argv[1], buf, sizeof(buf));
    if(ret == -1)
    {
        perror("readlink");
        exit(1);
    }
    buf[ret] = 0;
    printf("buf = %s\n", buf);

    return 0;
}

unlink() 函数:
作用:删除一个文件的目录项并减少它的链接数,若成功则返回0,否则返回-1,错误原因存于errno。如果想通过调用这个函数来成功删除文件,就必须拥有这个文件的所属目录的写和执行权限。
使用:1. 如果是符号链接,删除符号链接;2. 如果是硬链接,硬链接数减1,当减为0时,释放数据块和inode;3. 如果文件硬链接数为0,但有进程已打开该文件,并持有文件描述符,则等该进程关闭该文件时,kernel才真正去删除该文件(利用该特性创建临时文件,先open或creat创建一个文件,马上unlink此文件)。

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

int main(void)
{
    int fd = open("tempfile", O_CREAT | O_RDWR, 0755);
    if(fd == -1)
    {
        perror("open");
        exit(1);
    }

    int ret = unlink("tempfile");
    if(ret == -1)
    {
        perror("unlink");
        exit(1);
    }

    char buf[512];
    write(fd, "hello", 5);
    lseek(fd, 0, SEEK_SET);
    int len = read(fd, buf, sizeof(buf));
    write(STDOUT_FILENO, buf, len);

    close(fd);

    return 0;
}

参考

参考黑马程序员linux系统编程资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值