前几天在Linux下用系统调用stat函数写程序,stat 函数是 Linux 中的系统调用,用于获取文件相关的信息。
在ubuntu用man手册查看一下stat函数:
可以看到,stat函数的第二个参数是一个结构指针,这个结构中有三个成员是用来记录文件的被最后访问,文件内容被最后修改,文件状态被最后改变的信息的。
现在我需要把一个测试文件的这三个时间打印出来,可以使用ctime函数,
代码:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> /*此处需要包含头文件 time.h, ctime()需要用到*/ /** * Use sys_call func stat(). * Test the file's inode num and size. * Use ctime() get the time info of file. */ int main(int argc, char** argv) { if (argc != 2) { fprintf(stderr,"Usge: %s [file name]\n", argv[0]); exit(-1); } struct stat file_stat; int ret; ret = stat(argv[1], &file_stat); if (-1 == ret) { perror("stat error"); exit(-1); } printf("file size: %ld bytes\ninode number: %ld\n", file_stat.st_size, file_stat.st_ino); printf("%s", ctime(&file_stat.st_ctime)); printf("%s", ctime(&file_stat.st_atime)); printf("%s", ctime(&file_stat.st_mtime)); exit(0); }
编译:
有告警!暂且不管它。
运行:
出现了段错误,肯定是代码有问题,而且还是内存相关的问题。看gcc提示是说ctime()的返回值是整型,不对啊,我记得是返回是char* 类型。用man手册看一下:
确实是char*,突然想到如果不声明函数返回类型会默认返回整型,大概率是头文件没有包含,果然是time.h。加上然后重新编译运行果然没问题了。
修改:
总结:
虽然是很简单的问题,但是却不容忽视,在这里记录一下。Linux编程需要用到大量的函数,无论是是标准io还是文件io,不可能记得所有函数的头文件,我们可以用linux的man手册来查看函数的详细介绍,另外gcc编译代码时候,我建议加上 -Wall 选项,尽量把程序调到没有告警为止,除非里面的告警是你可以解释的,比如有些变量定义了但是没使用这样的你心里有数的。