6,access函数:判断调用程序的用户对于指定文件的权限(可读?可写?可执行?)
#include <unistd.h> int access(const char *pathname, int mode);pathname:文件
mode
R_OK:可读?
W_OK:可写?
X_OK:可执行?
F_OK:文件存在?
返回值
查询的权限存在或者文件存在:返回0。
查询的权限不存在或者文件不存在:返回-1。
例子:
#include <stdio.h> #include <unistd.h>//access int main(int argc, char* argv[]){ if(access(argv[1], R_OK) == 0) printf("read ok\n"); if(access(argv[1], W_OK) == 0) printf("write ok\n"); if(access(argv[1], X_OK) == 0) printf("exe ok\n"); if(access(argv[1], F_OK) == 0) printf("exists\n"); }
先用ls -l 查看/usr/include/time.h文件的权限,结果如下
ys@ys-VirtualBox:~/lianxi$ ls -l /usr/include/time.h -rw-r--r-- 1 root root 10360 4月 17 2018 /usr/include/time.h
用ys用户执行例子程序,查看/usr/include/time.h文件,结果如下。因为time.h是属于root用户的,对于其他用户来说是[r--],所以得出下面的结果。
ys@ys-VirtualBox:~/lianxi$ ./ac /usr/include/time.h read ok exists
还是用ys用户执行,但是加上sudo,结果如下。发现结果和root用户相同。因为加了sudo,就编程了root用户。
ys@ys-VirtualBox:~/lianxi$ sudo ./ac /usr/include/time.h [sudo] password for ys: read ok write ok exists7,truncate函数:截断文件和扩展文件的大小
#include <unistd.h> #include <sys/types.h> int truncate(const char *path, off_t length);path:文件
length:
length大于原来文件的大小,则扩展文件的大小至length
length小于原来文件的大小,则截断文件的大小至length
8,link函数:创建硬链接
#include <unistd.h> int link(const char *oldpath, const char *newpath);返回值:成功返回0,失败返回-1,并设置errno。
9,symlink函数:创建软链接
#include <unistd.h> int symlink(const char *target, const char *linkpath);返回值:成功返回0,失败返回-1,并设置errno。
10,readlink函数:找到软链接对应的实际文件,把文件的名字放入buf里。注意:硬链接不行。
#include <unistd.h> ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);返回值:成功返回写入buf的字节数,失败返回-1,并设置errno。
11,unlink函数:删除软硬链接,也可以删除文件。
#include <unistd.h> int unlink(const char *pathname);返回值:成功返回0,失败返回-1,并设置errno。
有个特殊用法:下面的open代码想要创建hello文件,然后直接用unlink删除,但是能写入成功,ret是大于0的,程序执行完,发现没有做成hello文件。
结论:当执行unlink后,计数为0后,但,发现别的进程还引用这个文件,这个时间点,unlink不会删除这个文件,等这个进程结束后,再删除,所以下面的write代码能够写入成功。
利用这个特点可以实现:在线观看视频时,实际是把视频文件下载到了本地(然后代码里,使用unlink),看完后视频文件的计数为0,就自动删除了,不怕视频被泄露出去。