Linux stat函数和stat命令(4)

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 exists

7,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,就自动删除了,不怕视频被泄露出去。

#include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> int main(){ int fd = open("hello", O_WRONLY | O_CREAT, 0666); unlink("hello"); int ret = write(fd, "aaa", 4); if(ret > 0){ printf("write OK\n"); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cece8045ebccfb7b6acd45f696ad5274.html