C++ Stress ng:使用execv编写应用程序,以调用Stress ng命令,并在成功或失败时返回
Stress ng:如何使用execv在C或Cpp中编写应用程序,以调用Stress ng命令进行MIPS中的CPU和内存测试,并在成功或失败时返回其状态? 给定一个已使用其工具链交叉编译为MIPS32版本的可执行应力ng文件 示例应力ng命令:C++ Stress ng:使用execv编写应用程序,以调用Stress ng命令,并在成功或失败时返回,c++,c,cross-compiling,embedded-linux,stress-testing,C++,C,Cross Compiling,Embedded Linux,Stress Testing,Stress ng:如何使用execv在C或Cpp中编写应用程序,以调用Stress ng命令进行MIPS中的CPU和内存测试,并在成功或失败时返回其状态? 给定一个已使用其工具链交叉编译为MIPS32版本的可执行应力ng文件 示例应力ng命令: stress-ng --vm 8 --vm-bytes 80% -t 1h stress-ng --cpu 8 --cpu-ops 800000 也许这就足够了: #include <stdio.h> #include <stdli
stress-ng --vm 8 --vm-bytes 80% -t 1h
stress-ng --cpu 8 --cpu-ops 800000
也许这就足够了:
#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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
pid_t pid;
int ret;
char*stress_ng=“/usr/bin/stress ng”;
char*argv_new[]={stress_ng,
“--vm”,“8”,“--vm字节”,“80%”,
“-t”,“2s”,“-v”,NULL};
char*env_new[]={NULL};
pid=fork();
if(pid<0){
fprintf(标准,“分叉失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}否则如果(pid==0){
ret=execve(应力、新参数、新环境);
如果(ret<0){
fprintf(标准,“执行失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
_出口(ret);
}否则{
/*母公司*/
智力状态;
ret=waitpid(pid和状态,0);
如果(ret<0){
fprintf(标准,“waitpid失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
ret=WEXITSTATUS(状态);
printf(“返回的压力:%d\n”,ret);
}
出口(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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
pid_t pid;
int ret;
char*stress_ng=“/usr/bin/stress ng”;
char*argv_new[]={stress_ng,
“--vm”,“8”,“--vm字节”,“80%”,
“-t”,“2s”,“-v”,NULL};
char*env_new[]={NULL};
pid=fork();
if(pid<0){
fprintf(标准,“分叉失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}否则如果(pid==0){
ret=execve(应力、新参数、新环境);
如果(ret<0){
fprintf(标准,“执行失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
_出口(ret);
}否则{
/*母公司*/
智力状态;
ret=waitpid(pid和状态,0);
如果(ret<0){
fprintf(标准,“waitpid失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
ret=WEXITSTATUS(状态);
printf(“返回的压力:%d\n”,ret);
}
出口(0);
}
如果要解析应力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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
pid_t pid;
int ret;
int-fds[2];
char*stress_ng=“/usr/bin/stress ng”;
char*argv_new[]={stress_ng,
“--vm”,“8”,“--vm字节”,“80%”,
“-t”,“2s”,“-v”,NULL};
char*env_new[]={NULL};
if(管道(fds)<0){
fprintf(标准,“管道失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
pid=fork();
if(pid<0){
fprintf(标准,“分叉失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}否则如果(pid==0){
//关闭(标准文件号);
关闭(标准文件号);
关闭(fds[0]);
dup2(fds[1],标准文件号);
dup2(fds[1],标准文件号);
ret=execve(应力、新参数、新环境);
如果(ret<0){
fprintf(标准,“执行失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
关闭(fds[1]);
_出口(ret);
}否则{
/*母公司*/
智力状态;
文件*fp;
字符缓冲区[1024];
关闭(fds[1]);
fp=fdopen(fds[0],“r”);
如果(!fp){
fprintf(标准,“fdopen失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
while(fgets(buffer,sizeof(buffer),fp)){
大小长度=strlen(缓冲区);
如果(len>0)
缓冲区[len-1]='\0';
if(strstr(缓冲区,“已完成”))
printf(“GOT:\n”,buffer);
}
fclose(fp);
关闭(fds[0]);
ret=waitpid(pid和状态,0);
如果(ret<0){
fprintf(标准,“waitpid失败:%d(%s)\n”,
厄尔诺,斯特雷罗(厄尔诺));
退出(退出失败);
}
ret=WEXITSTATUS(状态);
printf(“返回的压力:%d\n”,ret);
}
出口(0);
}
如果要解析应力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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
pid_t pid;
int ret;
int-fds[2];
char*stress_ng=“/usr/bin/stress ng”;
char*argv_new[]={stress_ng,
“--vm”,“8”,“--vm字节”,“80%”,
“-t”,“2s”,“-v”,NULL};
char*env_new[]={NULL};
if(管道(fds)<0){
fprintf(标准差)