2017-07-24 26 views
0

應力NG:如何使用execv調用應力-NG命令編寫C或CPP的應用程序在MIPS中進行CPU和內存測試,並在成功或失敗時返回其狀態? 給定一個可執行的壓力ng文件,該文件已使用其工具鏈交叉編譯爲MIPS32版本。應力NG:編寫使用execv調用壓力-ng的命令,並返回,如果它是成功還是失敗的應用程序

樣品壓力-NG命令:

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

你是怎麼嘗試到目前爲止?什麼不行? – Klaus

+0

歡迎來到Stack Overflow。請儘快閱讀[關於]和[問]頁面。您需要顯示您嘗試過的內容(MCVE - [MCVE])以及導致問題的原因。命令從哪裏來?爲什麼不使用'system()'?爲什麼'execv()'而不是'execvp()'?你需要什麼輸出?定時?等 –

回答

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); 
} 
+0

嗨科林,我怎麼可以解析的execve的輸出和返回的聲明「在成功完成2.06s」? – Linuxknowledgeseeker

+0

應力-NG返回0時它是成功的,所以你可以檢查,與WEXITSTATUS(狀態)的回報。 –

+0

是的,這是事實,但execv執行上會顯示日誌,我怎麼能隱藏他們,只是解析「30年代中成功完成」? – Linuxknowledgeseeker

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); 
} 
+0

嗨科林,我怎麼能由argv_new []使用上面的代碼是僅適用於單個命令初始化字符*執行多條命令?能否請你張貼的代碼?讓2個命令是應力 - 納克--vm 8 --vm字節80%-t 1H, 應力-NG --cpu 8 --cpu-OPS 800000 – Linuxknowledgeseeker

相關問題