【问题标题】:Stress-ng: Writing an application program using execv to invoke stress-ng commands and return if it is success or failureStress-ng:使用execv编写应用程序调用stress-ng命令,成功或失败返回
【发布时间】:2017-07-24 10:55:08
【问题描述】:

Stress-ng:如何使用 execv 在 C 或 Cpp 中编写应用程序来调用 MIPS 中的 CPU 和内存测试的压力命令,并在成功或失败时返回其状态? 给定一个可执行的 stress-ng 文件,该文件已使用其工具链交叉编译为 MIPS32 版本。

stress-ng 命令示例:

stress-ng --vm 8 --vm-bytes 80% -t 1h
stress-ng --cpu 8 --cpu-ops 800000

【问题讨论】:

  • 到目前为止你尝试了什么?什么不起作用?
  • 欢迎来到 Stack Overflow。请尽快阅读AboutHow to Ask 页面。您需要展示您尝试过的内容(MCVE —minimal reproducible example)以及导致问题的原因。命令来自哪里?为什么不使用system()?为什么execv() 而不是execvp()?你需要什么输出?定时?等等。

标签: c++ c cross-compiling embedded-linux stress-testing


【解决方案1】:

也许这就足够了:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
        pid_t pid;
        int ret;

        char *stress_ng = "/usr/bin/stress-ng";

        char *argv_new[] = { stress_ng,
                "--vm",  "8", "--vm-bytes",  "80%",
                "-t", "2s", "-v", NULL  };
        char *env_new[] = { NULL };

        pid = fork();
        if (pid < 0) {
                fprintf(stderr, "fork failed: %d (%s)\n",
                        errno, strerror(errno));
                exit(EXIT_FAILURE);
        } else if (pid == 0) {
                ret = execve(stress_ng, argv_new, env_new);
                if (ret < 0) {
                        fprintf(stderr, "execve failed: %d (%s)\n",
                                errno, strerror(errno));
                        exit(EXIT_FAILURE);
                }
                _exit(ret);
        } else {
                /* Parent */
                int status;

                ret = waitpid(pid, &status, 0);
                if (ret < 0) {
                        fprintf(stderr, "waitpid failed: %d (%s)\n",
                                errno, strerror(errno));
                        exit(EXIT_FAILURE);
                }
                ret = WEXITSTATUS(status);
                printf("stress-ng returned: %d\n", ret);
        }
        exit(0);
}

【讨论】:

  • 嗨 Colin,我如何解析 execve 的输出并返回语句“2.06 秒内成功完成”?
  • Stress-ng 成功时返回 0,因此您可以通过 WEXITSTATUS(status) 返回来检查。
  • 是的,确实如此,但执行时 execv 会显示日志,我该如何隐藏它们并仅解析“30 秒内成功完成”?
【解决方案2】:

如果要解析stress-ng的输出,则需要在父子节点之间创建一个管道,父节点需要通过管道读取和解析输出,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
    pid_t pid;
    int ret;
    int fds[2];

    char *stress_ng = "/usr/bin/stress-ng";

    char *argv_new[] = { stress_ng,
        "--vm",  "8", "--vm-bytes",  "80%",
        "-t", "2s", "-v", NULL  };
    char *env_new[] = { NULL };

    if (pipe(fds) < 0) {
        fprintf(stderr, "pipe failed: %d (%s)\n",
            errno, strerror(errno));
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid < 0) {
        fprintf(stderr, "fork failed: %d (%s)\n",
            errno, strerror(errno));
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        //close(STDERR_FILENO);
        close(STDIN_FILENO);
        close(fds[0]);
        dup2(fds[1], STDOUT_FILENO);
        dup2(fds[1], STDERR_FILENO);
        ret = execve(stress_ng, argv_new, env_new);
        if (ret < 0) {
            fprintf(stderr, "execve failed: %d (%s)\n",
                errno, strerror(errno));
            exit(EXIT_FAILURE);
        }
        close(fds[1]);
        _exit(ret);
    } else {
        /* Parent */
        int status;
        FILE *fp;
        char buffer[1024];

        close(fds[1]);
        fp = fdopen(fds[0], "r");
        if (!fp) {
            fprintf(stderr, "fdopen failed: %d (%s)\n",
                errno, strerror(errno));
            exit(EXIT_FAILURE);
        }

        while (fgets(buffer, sizeof(buffer), fp)) {
            size_t len = strlen(buffer);
            if (len > 0)
                buffer[len - 1] = '\0';

            if (strstr(buffer, "completed"))
                printf("GOT: <%s>\n", buffer);
        }
        fclose(fp);
        close(fds[0]);

        ret = waitpid(pid, &status, 0);
        if (ret < 0) {
            fprintf(stderr, "waitpid failed: %d (%s)\n",
                errno, strerror(errno));
            exit(EXIT_FAILURE);
        }
        ret = WEXITSTATUS(status);
        printf("stress-ng returned: %d\n", ret);
    }
    exit(0);
}

【讨论】:

  • 嗨 Colin,我怎样才能通过使用上述代码初始化 char *argv_new[ ] 来执行多个命令,该代码仅适用于单个命令?你能发布代码吗?让这2个命令是stress-ng --vm 8 --vm-bytes 80% -t 1h, stress-ng --cpu 8 --cpu-ops 800000
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2017-01-22
  • 2020-04-19
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多