2017-07-24 4 views
0

Stress-ng: Comment écrire un programme d'application en C ou Cpp en utilisant execv pour invoquer des commandes stress-ng pour Tester le processeur et la mémoire dans MIPS et retourner son statut si c'est un succès ou un échec? Etant donné qu'un fichier stress-ng exécutable a été compilé de façon croisée avec la version MIPS32 en utilisant sa chaîne d'outils.Stress-ng: écrire un programme d'application en utilisant execv pour invoquer des commandes stress-ng et retourner en cas de succès ou d'échec

Sample commandes stress ng:

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

Qu'avez-vous essayer jusqu'à présent? Qu'est-ce qui ne fonctionne pas? – Klaus

+0

Bienvenue dans Stack Overflow. Veuillez lire les pages [A propos de] et [Demander] bientôt. Vous devez montrer ce que vous avez essayé (un MCVE - [MCVE]) et ce qui cause des problèmes. D'où viennent les commandes? Pourquoi ne pas utiliser 'system()'? Pourquoi 'execv()' au lieu de 'execvp()'? Quelle sortie avez-vous besoin? Timing? Etc. –

Répondre

0

Peut-être cela suffira:

#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

Salut Colin, Comment puis-je analyser la sortie de execve et retourner l'instruction "Terminé avec succès en 2.06s"? – Linuxknowledgeseeker

+0

Stress-ng renvoie 0 quand il a réussi, vous pouvez donc vérifier cela avec le retour WEXITSTATUS (status). –

+0

Oui c'est vrai, mais execv sur l'exécution va montrer les journaux, comment puis-je les cacher et juste analyser "Successfully completed in 30s"? – Linuxknowledgeseeker

0

Si vous voulez analyser la sortie du stress-ng, vous devez créer un tuyau entre le parent et enfant et le parent a besoin de lire et d'analyser la sortie sur le tuyau, quelque chose comme le suivant:

#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

Salut Colin, comment puis-je exécuter plusieurs commandes en initialisant char * argv_new [] en utilisant le code ci-dessus qui est seulement pour une seule commande? Pourriez-vous s'il vous plaît poster le code pour cela? Laissez les 2 commandes être stress-ng --vm 8 --vm-bytes 80% -t 1h, stress-ng --cpu 8 --cpu-ops 800000 – Linuxknowledgeseeker