Stress-ng: написание прикладной программы с использованием execv для вызова команд стресс-ng и возврата в случае успеха или неудачи

Stress-ng: Как написать прикладную программу на C или Cpp, используя execv, чтобы вызывать команды стресс-ng для тестирования ЦП и памяти в MIPS и возвращать его статус, если он успешен или неуспешен?
Имеется исполняемый файл стресс-нг, который был скомпилирован в версию MIPS32 с использованием его цепочки инструментов.

Примеры команд стресс-нг:

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

0

Решение

Возможно, этого будет достаточно:

#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);
}
1

Другие решения

Если вы хотите проанализировать вывод стресс-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);
}
1

По вопросам рекламы [email protected]