免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2428 | 回复: 5
打印 上一主题 下一主题

[C] 关于fstat系统调用stat结构的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-17 18:28 |只看该作者 |倒序浏览
linux下写了一个fstat系统调用提取文件信息的程序,代码如下:
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <sys/fcntl.h>

  5. int
  6. main(int argc, char **argv)
  7. {
  8.   int file_desc;
  9.   char *filename = argv[1];
  10. /*  struct stat {
  11.     dev_t     st_dev;
  12.     ino_t     st_ino;
  13.     mode_t    st_mode;
  14.     nlink_t   st_nlink;
  15.     uid_t     st_uid;
  16.     gid_t     st_gid;
  17.     dev_t     st_rdev;
  18.     off_t     st_size;
  19.     blksize_t st_blksize;
  20.     blkcnt_t  st_blocks;
  21.     time_t    st_atime;
  22.     time_t    st_mtime;
  23.     time_t    st_ctime;
  24.   };
  25. */
  26.   struct stat stat_buf;

  27.   file_desc = open(filename, O_RDONLY);
  28.   if (file_desc < 0) {
  29.     printf("File %s open failed\n", filename);
  30.     return 1;
  31.   } else
  32.     fstat(file_desc, &stat_buf);
  33.     printf("st_dev is %d, st_ino is %d, st_size is %d\n", stat_buf.st_dev, stat_buf.st_ino, stat_buf.st_size);
  34.    
  35.   close(filename);
  36.   return 0;
  37. }
复制代码
编译后获取/etc/passwd文件信息如下:
[root@centos c]# ./fstat /etc/passwd
st_dev is 2050, st_ino is 0, st_size is 650569
而ls -li看到的信息如下:
[root@centos c]# ls -li /etc/passwd
650569 -rw-r--r-- 1 root root 1725 10-12 15:03 /etc/passwd
可以看到/etc/passwd的i节点号为650569,而我的程序获得的st_ino为0,而st_size为650569,获取的文件信息错乱了。
确实不知道什么原因,还请大家指点。谢谢!

stat结构为代码里面注释掉的那一段struct。

系统版本如下:
Linux centos.local 2.6.18-238.el5 #1 SMP Thu Jan 13 16:24:47 EST 2011 i686 i686 i386 GNU/Linux
CentOS release 5.6 (Final)
gcc版本:
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)

论坛徽章:
0
2 [报告]
发表于 2012-10-17 18:32 |只看该作者
代码最后
printf("st_dev is %d, st_ino is %d, st_size is %d\n", stat_buf.st_dev, stat_buf.st_ino, stat_buf.st_size);
缩进有问题,和if else无关。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-10-17 22:16 |只看该作者
楼上真理了.

论坛徽章:
0
4 [报告]
发表于 2012-10-18 08:39 |只看该作者
不是,我就补充说明下。代码影响阅读,但是语法没问题。

论坛徽章:
1
午马
日期:2013-12-19 13:55:53
5 [报告]
发表于 2012-10-18 09:56 |只看该作者
  1. printf("st_ino = %ld,  st_size = %lld",   (long)stat_buf.st_ino, (long long)stat_buf.st_size);
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-10-18 22:25 |只看该作者
谢谢smarter_feng,但是我不知道这些ino_t,off_t这些类型到底哪里定义的,无法确定是用long还是long long
sys/types.h里面那好像不是的呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP