当前位置:  开发笔记 > 运维 > 正文

以特定的速度执行stdout输出

如何解决《以特定的速度执行stdout输出》经验,为你挑选了1个好方法。

对于我的应用程序的负载测试(在Linux下),我正在寻找一个以特定速率(如100字节/秒)在stdout上输出数据的工具,这样我就可以将输出传输到netcat,然后将其发送给我的应用.dd的一些选项是理想的,但到目前为止我没有找到任何东西.打印什么类型的数据并不重要(NUL字节可以).任何提示?



1> Chris Jester..:

我写了一个快速程序,它接受一个参数,A每秒打印到标准输出的字符数(负参数意味着没有速率限制).希望这可以帮助!:-)(在GNU libc上,你需要链接你的程序-lrt.)

编辑:默认情况下修改为打印点,除非指定了第二个参数,在这种情况下使用的是第一个字符.(这意味着,如果你想打印NUL字符,只需指定一个空字符串作为第二个参数.:-))

#include 
#include 
#include 
#include 
#include 

int
sleeptill(const struct timespec *when)
{
    struct timespec now, diff;

    clock_gettime(CLOCK_REALTIME, &now);
    diff.tv_sec = when->tv_sec - now.tv_sec;
    diff.tv_nsec = when->tv_nsec - now.tv_nsec;
    while (diff.tv_nsec < 0) {
        diff.tv_nsec += 1000000000;
        --diff.tv_sec;
    }
    if (diff.tv_sec < 0)
        return 0;
    return nanosleep(&diff, 0);
}

int
main(int argc, char **argv)
{
    double rate = 0.0;
    char *endp;
    struct timespec start;
    double offset;

    if (argc >= 2) {
        rate = strtod(argv[1], &endp);
        if (endp == argv[1] || *endp)
            rate = 0.0;
        else
            rate = 1 / rate;

        if (!argv[2])
            argv[2] = ".";
    }

    if (!rate) {
        fprintf(stderr, "usage: %s rate [char]\n", argv[0]);
        return 1;
    }

    clock_gettime(CLOCK_REALTIME, &start);
    offset = start.tv_nsec / 1000000000.0;

    while (1) {
        struct timespec till = start;
        double frac;
        double whole;

        frac = modf(offset += rate, &whole);
        till.tv_sec += whole;
        till.tv_nsec = frac * 1000000000.0;
        sleeptill(&till);
        write(STDOUT_FILENO, argv[2], 1);
    }
}

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有