IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux c文件 stat()和lstat()的区别 -> 正文阅读

[系统运维]linux c文件 stat()和lstat()的区别

书上的说法是:

lstat与stat相同,除非是符号链接,统计链接本身,而不是链接所引用文件。所以,stat和lstat的区别是:stat遵循链接,但lstat不是

当初看这段话并没有真正理解,下面详细解释下:
首先,无论是stat还是lstat,对于硬链接文件,都将其视为regular文件,不同点只在于符号链接(symlink)文件。

对于stat(file, &mystat)这个系统调用,无论是读取regular文件还是symlink文件,通过mystat.st_mode获取到的文件类型都必然是regular文件,即S_ISREG(mystat.st_mode) == 1

对于lstat(file, &mystat)这个系统调用,当file是symlink文件时,通过mystat.st_mode获取到的文件类型是link文件,即S_ISLNK(mystat.st_mode) == 1

所以,当我们想要识别符号链接文件的时候,只能使用lstat;当我们关注的是符号链接指向的文件时,就应该使用stat

下面展示mycp程序的一部分,file1是待复制的文件,file2是复制得到的文件。对于符号链接文件会创建对应的新符号链接,而不是简单的复制文件。对于reguler文件,会复制文件。

	struct stat mystat;
    if(lstat(file1, &mystat) < 0){//must be lstat, not stat
        printf("stat %s fail\n", file1);
        exit(-1);
    }
    printf("%s st_mode is %x\n", file1, mystat.st_mode);
    if(S_ISLNK(mystat.st_mode)){
        char linkName[FILE_NAME_LEN], fullLinkName[FILE_NAME_LEN];
        strcpy(fullLinkName,file2);
        readlink(file1, linkName, FILE_NAME_LEN);
        for(int i=strlen(fullLinkName)-1;i>=0;i--){
            if(fullLinkName[i] == '/'){
                fullLinkName[i+1] = 0;
                break;
            }
        }
        strcat(fullLinkName, linkName);
        symlink(fullLinkName, file2);
        printf("link file %s to file %s\n", fullLinkName, file2);
    }
    else if(S_ISREG(mystat.st_mode)){
        int oldFd = open(file1, O_RDONLY);
        int newFd = open(file2, O_RDWR | O_CREAT | O_TRUNC, 0664);
        int n=0;
        char buf[4096];
        while(n = read(oldFd, buf, 4096)){
            write(newFd, buf, n);
        }
        close(oldFd);
        close(newFd);
        printf("copy file %s to file %s\n", file1, file2);
    }
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-04 07:32:52  更:2022-05-04 07:32:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:23:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码