🛸1. access函数
#include <unistd.h>
int access(const char *pathname, int mode);
下面通过一个例子演示access函数的用法。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
if(argc < 2)
{
printf("not found filename\n");
return -1;
}
if(access(argv[1], F_OK) == 0)
{
printf("%s: F_OK\n", argv[1]);
}
else
{
printf("no file name is %s\n", argv[1]);
return 0;
}
if(access(argv[1], R_OK) == 0)
{
printf("%s: R_OK\n", argv[1]);
}
else
{
printf("can not read %s\n", argv[1]);
}
if(access(argv[1], W_OK) == 0)
{
printf("%s: W_OK\n", argv[1]);
}
else
{
printf("can not write %s\n", argv[1]);
}
if(access(argv[1], X_OK) == 0)
{
printf("%s: X_OK\n", argv[1]);
}
else
{
printf("can not execution %s\n", argv[1]);
}
return 0;
}
下面测试一下代码,来说明access函数的作用,首先我们在普通用户下测试该函数 现在我们切换到root用户,或者在普通用户下使用sudo命令,再运行一下该函数 对比上面两次测试结果,这时候我们发现一个奇怪的现象,同一个文件1.txt在qq用户下使用access函数返回的是无写权限,但是在root用户下使用access函数返回的是有写权限,这是为什么呢?首先,我们通过 ls -l 命令来查看并分析一下文件1.txt的权限位。首先可以看到,文件归属于root用户,并且该文件对归属用户的权限位是 rw- ,有写权限,对其它用户的权限位是 r-- ,无写权限。也就是说,这个文件1.txt对root用户有写权限,对其他用户比如qq无写权限。现在原因就比较清晰了,access函数在判断权限的时候是判断有效用户的权限,比如说有一个文件对usr1无权限,我们使用access函数获取时确实没有执行权限,但是如果用sudo去执行的话(或者在root用户下执行),就相当于判断这个文件对root用户的权限。也就是说,access函数是判断一个文件相对于某个用户的权限,而不是说文件本身的权限,access函数返回的是文件对某一用户的权限。
🛸2. chmod函数
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
🛸3. chown函数
#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
注意,在查看man手册的时候,如果直接使用 man chown 的话,假如有同名命令会显示同名命令。所以,如果你查看man手册如果发现没有函数原型,说明该函数有同名命令,需要加上章节才能查看函数的帮助手册 man 2 chown,系统调用都在第2章节。
🛸4. rename函数
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
示例分析
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
if(argc < 3)
{
printf("not found oldpathname & newpathname\n");
return -1;
}
rename(argv[1], argv[2]);
return 0;
}
rename函数可以为文件或目录重命名 rename函数在重命名时也可以改变文件的路径,相当于移动且重命名
🛸5. truncate函数
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
下面通过一个例子来说明truncate函数的用法。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char* argv[])
{
if(argc < 3)
{
printf("not found filename\n");
return -1;
}
printf("file %s truncate : 1024 byte\n", argv[1]);
truncate(argv[1], 1024);
printf("file %s truncate : 4 byte\n", argv[2]);
truncate(argv[2], 4);
return 0;
}
运行函数,查看测试结果 使用vim编辑器打开可以看到被扩展的文件中填充了很多@字符(其实都是空字节 \0 只不过在不同平台上显示出来不一样而已)。
|