如何正确命名在函数内创建的不同文件?

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);