linux c文件 stat()和lstat()的区别

本文详细解析了stat和lstat系统调用在处理文件,尤其是符号链接时的不同之处。stat会跟随链接到目标文件,而lstat则返回链接本身的信息。在编程场景中,识别符号链接时需使用lstat,而复制文件内容则需用stat。示例代码展示了如何在mycp程序中应用这两个调用来正确处理不同类型的文件。
摘要由CSDN通过智能技术生成

书上的说法是:

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值