2012-09-09 93 views
0

我正在做一个stat() - 调用,返回一个结构与我想要提取的信息。到目前为止,我成功地获得了我想要的内容,直到获得访问时间,修改和最后更改文件的时间。使用ctime分段错误

我想用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的零经验我在之前的课程中学习过Assembly,但很简单。我试图读取time.h的API,但我真的无法找到解决方案。

我非常感谢任何帮助或提示,我可以得到!

谢谢, ž

+0

的printf通常行缓冲。直到它看到一个换行符(默认情况下)才会打印出来。换行符是最后一个失败的printf,因此设备行不会出现在屏幕上。 –

回答

3

功能ctime期望一个const time_t *。你可能想:

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

请使用

ctime(&result.st_atime) 

,不要忘记

#include <time.h> 
+1

感谢提醒'#include '! –

+0

@Zyril:你在做什么编译没有'ctime()'范围的原型?你应该设置你的编译警告,这样你就不能在范围内编译没有原型的代码(例如'-Werror = missing-prototypes',或者至少'-Wall'),这样你就无法进入一团糟。这是一种自我保护措施。 –

+0

乔纳森你好!这是我正在理解内核如何工作的一门课程,我们正在研究系统调用。我想在C中编写一个函数,输出stat返回的结构中的数据。 我对此很新,所以我不确定你的原型是什么意思。我没有收到任何编译警告。 –