设为首页 加入收藏

TOP

Linux stat函数和stat命令(三)
2019-05-23 14:39:39 】 浏览:283
Tags:Linux stat 函数 命令
de)) str[0] = 'b'; if(S_ISFIFO(sbuf.st_mode)) str[0] = 'p'; if(S_ISLNK(sbuf.st_mode)) str[0] = 'l'; if(S_ISSOCK(sbuf.st_mode)) str[0] = 's'; //本用户的文件权限 if(sbuf.st_mode & S_IRUSR) str[1] = 'r'; if(sbuf.st_mode & S_IWUSR) str[2] = 'w'; if(sbuf.st_mode & S_IXUSR) str[3] = 'x'; //本用户的组的文件权限 if(sbuf.st_mode & S_IRGRP) str[4] = 'r'; if(sbuf.st_mode & S_IWGRP) str[5] = 'w'; if(sbuf.st_mode & S_IXGRP) str[6] = 'x'; //其他用户的文件权限 if(sbuf.st_mode & S_IROTH) str[7] = 'r'; if(sbuf.st_mode & S_IWOTH) str[8] = 'w'; if(sbuf.st_mode & S_IXOTH) str[9] = 'x'; char ymd[20] = {0}; //取得日期和时间 struct tm* tm = localtime(&sbuf.st_atim.tv_sec); sprintf(ymd, "%2d月 %2d %02d:%02d", tm->tm_mon + 1, tm->tm_mday, tm->tm_hour + 1,tm->tm_sec); //-rw-r--r-- 1 ys ys 134 4月 25 09:21 st2.c printf("%s %ld %s %s %ld %s %s\n", str, sbuf.st_nlink, getpwuid(sbuf.st_uid)->pw_name, getgrgid(sbuf.st_gid)->gr_name, sbuf.st_size, ymd, argv[1]); return 0; }

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()
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇软件工程结对作业1 下一篇求给定精度的简单交错序列部分和

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目