在C语言中,如何在linux中获得完整的时间戳(即使在秒之后)?
我得到一个字节流,在每2000个字节之后,我想创建一个新文件并存储它。由于它是一个连续的字节流,我不能使用计数器等。 所以,我想使用系统时间戳来唯一地标识文件,比如在C语言中,如何在linux中获得完整的时间戳(即使在秒之后)?,c,linux,operating-system,unix-timestamp,timestamp-with-timezone,C,Linux,Operating System,Unix Timestamp,Timestamp With Timezone,我得到一个字节流,在每2000个字节之后,我想创建一个新文件并存储它。由于它是一个连续的字节流,我不能使用计数器等。 所以,我想使用系统时间戳来唯一地标识文件,比如filename 我找到了一些线程来获取系统时间戳,但我看到的只有几秒钟。是否有其他方法可以在C、linux操作系统中获得完整的时间戳(timestmap-like:2011-11-08 18:02:08.954092000)? 在所有线程中,我只能看到几秒钟,如2011-11-08 18:02:08使用date--rfc-3339=
filename
我找到了一些线程来获取系统时间戳,但我看到的只有几秒钟。是否有其他方法可以在C、linux操作系统中获得完整的时间戳(timestmap-like:2011-11-08 18:02:08.954092000
)?
在所有线程中,我只能看到几秒钟,如2011-11-08 18:02:08
使用date--rfc-3339='ns'
命令以纳秒精度查看o/p。您可以尝试查看“man date”
命令以了解更详细的信息。如您所见,以下是使用此命令获得的o/p:
[user1@mach]# date --rfc-3339='ns'
2015-07-29 03:34:09.077024060-07:00
使用date--rfc-3339='ns'
命令以纳秒精度查看o/p。您可以尝试查看“man date”
命令以了解更详细的信息。如您所见,以下是使用此命令获得的o/p:
[user1@mach]# date --rfc-3339='ns'
2015-07-29 03:34:09.077024060-07:00
Linux具有纳秒级的分辨率
示例代码
#include <stdio.h>
#include <time.h>
int main(void) {
unsigned mult = 0;
struct timespec t0, t1;
clock_gettime(CLOCK_REALTIME, &t0);
for (unsigned k = 0; k < 10000000; k++) mult *= k; // no overflow!
clock_gettime(CLOCK_REALTIME, &t1);
printf("%lld.%09ld --> %lld.%09ld\n",
(long long)t0.tv_sec, t0.tv_nsec,
(long long)t1.tv_sec, t1.tv_nsec);
return 0;
}
#包括
#包括
内部主(空){
无符号mult=0;
结构时间段t0,t1;
时钟获取时间(时钟实时,&t0);
对于(无符号k=0;k<10000000;k++)mult*=k;//无溢出!
时钟获取时间(时钟实时和t1);
printf(“%lld.%09ld-->%lld.%09ld\n”,
(长)t0.tv_秒,t0.tv_秒,
(长)t1.tv_sec,t1.tv_nsec);
返回0;
}
在我的机器上(FreeBSD/Unix,但应该与任何Linux相同),上面的代码都会打印出来
1438167485.022409606 --> 1438167485.055779608
1438167485.022409606-->1438167485.055779608Linux具有纳秒分辨率
示例代码
#include <stdio.h>
#include <time.h>
int main(void) {
unsigned mult = 0;
struct timespec t0, t1;
clock_gettime(CLOCK_REALTIME, &t0);
for (unsigned k = 0; k < 10000000; k++) mult *= k; // no overflow!
clock_gettime(CLOCK_REALTIME, &t1);
printf("%lld.%09ld --> %lld.%09ld\n",
(long long)t0.tv_sec, t0.tv_nsec,
(long long)t1.tv_sec, t1.tv_nsec);
return 0;
}
#包括
#包括
内部主(空){
无符号mult=0;
结构时间段t0,t1;
时钟获取时间(时钟实时,&t0);
对于(无符号k=0;k<10000000;k++)mult*=k;//无溢出!
时钟获取时间(时钟实时和t1);
printf(“%lld.%09ld-->%lld.%09ld\n”,
(长)t0.tv_秒,t0.tv_秒,
(长)t1.tv_sec,t1.tv_nsec);
返回0;
}
在我的机器上(FreeBSD/Unix,但应该与任何Linux相同),上面的代码都会打印出来
1438167485.022409606 --> 1438167485.055779608
1438167485.022409606-->1438167485.055779608创建具有毫秒时间戳的文件名字符串的示例代码: 在ms.c中获取时间
创建具有毫秒时间戳的文件名字符串的示例代码: 在ms.c中获取时间
使用时间戳,无论精度如何,仍然可能发生冲突。使用
tmpnam()
。要“生成一个有效文件名且与现有文件名不同的字符串”,请同时tmpfile_s()
注意,在Linux中,“inode”是4k,每个文件数据块是4k。因此,制作一堆2k字节的文件是对磁盘空间的极大浪费。建议:以4096字节的块保存到新文件使用时间戳,无论精度如何,仍可能发生冲突。使用tmpnam()
。要“生成一个有效文件名且与现有文件名不同的字符串”,请同时tmpfile_s()
注意,在Linux中,“inode”是4k,每个文件数据块是4k。因此,制作一堆2k字节的文件是对磁盘空间的极大浪费。建议:以4096字节的块保存到新文件,与sprintf(文件名“%lu”,时间)相关,Linux是否将time\t`指定为unsigned long
。带有“时钟应为整数或实浮点型。[CX][选项开始]时间应为整数型。[选项结束]”。无论如何需要进行转换才能打印它printf(“%lu”,无符号长时间)代码>关于sprintf(文件名,“%lu”,时间)
,Linux是否将time\t`指定为unsigned long
。带有“时钟应为整数或实浮点型。[CX][选项开始]时间应为整数型。[选项结束]”。无论如何需要进行转换才能打印它printf(“%lu”,无符号长时间)代码>