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


被折叠的 条评论
为什么被折叠?



