【问题标题】:Segmentation fault using ctime使用 ctime 的分段错误
【发布时间】:2012-09-09 12:10:52
【问题描述】:

我正在进行一个 stat() 调用,它返回一个包含我想要提取的信息的结构。到目前为止,我成功地得到了我想要的,直到获得文件的访问时间、修改时间和最后更改时间。

我想用ctime来获取,然后用printf打印出来。

    printf("File: %s",argv[1]);
    printf("\nSize: %d",result.st_size);
    printf("        Blocks: %d",result.st_blocks);
    printf("        IO Block: %d",result.st_blksize);
    printf("\nDevice: 0x%x",result.st_dev);
    printf("        Inode: %d",result.st_ino);
    printf("        Links: %d",result.st_nlink);
//  printf("\nAccess: %s",ctime(result.st_atime));

这段代码运行良好,输出如下:

File: /etc/passwd
Size: 2250043           Blocks: 4416            IO Block: 4096
Device: 0x6804          Inode: 9738432          Links: 1

如果我取消注释要获取访问时间的最后一行,我会得到以下输出:

File: /etc/passwd
Size: 2250043           Blocks: 4416            IO Block: 4096
Segmentation fault

我该如何解决这个问题?另外,为什么我会在设备、Inode 和链接打印出来之前遇到分段错误?不应该打印出来然后产生分段错误吗?

我的 C 语言经验几乎为零。我在之前的课程中学习过汇编,但非常简短。我试图阅读 time.h 的 API,但我无法真正找到解决方案。

非常感谢我能得到的任何帮助或提示!

谢谢, Z

【问题讨论】:

  • printf 通常是行缓冲的。在看到换行符之前不会打印任何内容(默认情况下)。换行符是最后一个失败的 printf,因此 Device 行不会出现在屏幕上。

标签: c gcc segmentation-fault


【解决方案1】:

函数ctime 需要const time_t *。你可能想要:

printf("\nAccess: %s",ctime(&result.st_atime));
                            ^

【讨论】:

    【解决方案2】:

    请使用

    ctime(&result.st_atime)
    

    别忘了

    #include <time.h>
    

    【讨论】:

    • @Zyril:如果没有ctime() 的原型,你在做什么?你应该设置你的编译警告,这样你就不能编译没有范围内的原型的代码(例如-Werror=missing-prototypes,或者至少-Wall),这样你就不会陷入这样的混乱。这是一种自我保护措施。
    • 你好乔纳森!这是我正在学习的一门课程,以了解内核的工作原理,我们正在研究系统调用。我想用 C 编写一个函数,打印出 stat 返回的结构中的数据。我对此很陌生,所以我不确定你对原型的意思。我没有收到任何编译警告。
    猜你喜欢
    • 2013-01-08
    • 2013-06-24
    • 1970-01-01
    • 2016-09-05
    • 2015-02-28
    • 2015-11-16
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多