如何正确命名在函数内创建的不同文件?
How to properly name different files created inside a function?
我知道一般怎么做,但我有一个特殊情况。
我正在开发一个函数,用于将来自 TLS 的 证书 保存在一个文件中。
该函数的参数是证书(如unsigned char *
)及其长度。
这个函数在很短的时间内被调用了很多次,所以主要的问题是为每个创建的文件指定不同的名称。
一开始我用"time"取不同的名字
strftime(filename, sizeof(filename), "cert_%d-%m-%Y_%H:%M:%S.der", timeinfo);
但问题是如果在 比秒更短的时间段内创建了两个或更多文件,最新的文件会覆盖旧的一.
如何正确解决这个问题?有什么建议吗?
这是功能代码:
static void save_certificate_FILE(const unsigned char * cert, u_int16_t cert_len)
{
FILE *fw;
X509 *x_cert;
char filename[cert_len];
struct tm *timeinfo;
time_t rawtime;
x_cert = d2i_X509(NULL, &cert, cert_len);
if (!x_cert) {
fprintf(stderr, "Error on d21_X509 funtion\n");
return;
}
// get the time
time(&rawtime);
timeinfo = localtime (&rawtime);
// save every file with the time certificate was catched
strftime(filename, sizeof(filename), "cert_%d-%m-%Y_%H:%M:%S.der", timeinfo);
if(!(fw = fopen(filename,"w"))) {
fprintf(stderr, "Error on opening file descriptor fw\n");
return;
}
// function to convert raw data (DER) to PEM certificate (good for parsing with openssl)
i2d_X509_fp(fw, x_cert);
// free cert e close file descriptor
X509_free(x_cert);
fclose(fw);
}
正如@Chris Turner 在评论中建议我的那样,我使用 gettimeofday
来保留命名文件的时间(更适合按日期排序)。
这是我用来解决的代码:
gettimeofday(&tv, NULL);
millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec
if(millisec>=1000) { // Allow for rounding up to nearest second
millisec -=1000;
tv.tv_sec++;
}
timeinfo = localtime(&tv.tv_sec);
/* save every file with the time certificate was catched */
strftime(filename, sizeof(filename), "cert_%Y-%m-%d_%H-%M-%S-%%03u.der", timeinfo);
snprintf(buff, sizeof(buff), filename, tv.tv_usec);
我知道一般怎么做,但我有一个特殊情况。
我正在开发一个函数,用于将来自 TLS 的 证书 保存在一个文件中。
该函数的参数是证书(如unsigned char *
)及其长度。
这个函数在很短的时间内被调用了很多次,所以主要的问题是为每个创建的文件指定不同的名称。
一开始我用"time"取不同的名字
strftime(filename, sizeof(filename), "cert_%d-%m-%Y_%H:%M:%S.der", timeinfo);
但问题是如果在 比秒更短的时间段内创建了两个或更多文件,最新的文件会覆盖旧的一.
如何正确解决这个问题?有什么建议吗? 这是功能代码:
static void save_certificate_FILE(const unsigned char * cert, u_int16_t cert_len)
{
FILE *fw;
X509 *x_cert;
char filename[cert_len];
struct tm *timeinfo;
time_t rawtime;
x_cert = d2i_X509(NULL, &cert, cert_len);
if (!x_cert) {
fprintf(stderr, "Error on d21_X509 funtion\n");
return;
}
// get the time
time(&rawtime);
timeinfo = localtime (&rawtime);
// save every file with the time certificate was catched
strftime(filename, sizeof(filename), "cert_%d-%m-%Y_%H:%M:%S.der", timeinfo);
if(!(fw = fopen(filename,"w"))) {
fprintf(stderr, "Error on opening file descriptor fw\n");
return;
}
// function to convert raw data (DER) to PEM certificate (good for parsing with openssl)
i2d_X509_fp(fw, x_cert);
// free cert e close file descriptor
X509_free(x_cert);
fclose(fw);
}
正如@Chris Turner 在评论中建议我的那样,我使用 gettimeofday
来保留命名文件的时间(更适合按日期排序)。
这是我用来解决的代码:
gettimeofday(&tv, NULL);
millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec
if(millisec>=1000) { // Allow for rounding up to nearest second
millisec -=1000;
tv.tv_sec++;
}
timeinfo = localtime(&tv.tv_sec);
/* save every file with the time certificate was catched */
strftime(filename, sizeof(filename), "cert_%Y-%m-%d_%H-%M-%S-%%03u.der", timeinfo);
snprintf(buff, sizeof(buff), filename, tv.tv_usec);