有很多关于如何测量循环执行时间的例子,但是在下面的例子中,当调用localtime()时,我想获取当前的日期和时间,以区分远程服务器上日志(log)文件中的循环迭代:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <libssh/libssh.h>

#define BILLION 1000000000.0

int main(void) {
    struct timespec start, finish;
    time_t t = time(NULL);

    ssh_session session;

    int rc;
    int session_status;
    session = ssh_new();

    const char *host = "127.0.0.1";
    const char *port = "22";
    const char *username = "user";
    const char *password = "pass";

    char *reply;

    ssh_options_set(session, SSH_OPTIONS_HOST, host);
    ssh_options_set(session, SSH_OPTIONS_PORT_STR, port);
    ssh_options_set(session, SSH_OPTIONS_USER, username);

    session_status = ssh_get_status(session);
    printf("Session status: %d\n", session_status);

    for (int i = 0; i < 4; ++i) {
        clock_gettime(CLOCK_REALTIME, &start);
        rc = ssh_connect(session);

        if (rc != SSH_OK) {
            fprintf(stderr, "Error connecting to %s: %s\n", host, ssh_get_error(session));
            ssh_free(session);
            exit(-1);
        }

        if (ssh_userauth_password(session, NULL, password) == SSH_AUTH_SUCCESS) {
            reply = "Authentication succeeded with incorrect password.";
        }
        else {
            reply = "Authentication failed with incorrect password.";
        }
        clock_gettime(CLOCK_REALTIME, &finish);

        double time_spent = (finish.tv_sec - start.tv_sec) + (finish.tv_nsec - start.tv_nsec) / BILLION;

        struct tm tm = *localtime(&t);
        printf("[%d-%02d-%02d %02d:%02d:%02d] Status:%s ",
                tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, reply);
        printf("Elapsed time: %.4f seconds.\n", time_spent);

        ssh_disconnect(session);
    }

    ssh_free(session);

    return (0);
}

运行代码段后,每次迭代的日期和时间都相同.如何显示当前时间?

推荐答案

localtime(&t)更改为localtime(&start.tv_sec).

之所以得到与localtime(&t)相同的日期和时间,是因为在循环中t的值保持不变.

C++相关问答推荐

返回一个包含数组的 struct

GCC预处理宏和#杂注GCC展开

我无法让LLDB正确运行我的可执行文件

函数内的局部字符指针

在Apple Silicon上编译x86的Fortran/C程序

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

这个计算C中阶乘的函数正确吗?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

这个空指针类型的转换是有效代码还是恶意代码?

为什么这个分配做得不好呢?

静态初始化顺序失败是否适用于C语言?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

问题:C#Define上的初始值设定项元素不是常量

变量值不正确的问题

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

添加/删除链表中的第一个元素

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

Zig 中 C 的system函数的惯用替代方案