Uso de memoria del proceso secundario en C -- ampo con linux campo con memory campo con fork camp Relacionados El problema

Memory usage of child process in C


1
vote

problema

Español

Leí el Artículo sobre el uso de la memoria que calcula en C y tiene problema.

Escribo un programa de prueba simple, que podría estar funcionando más de un segundo y use más de 1 kb de memoria.

  #include <stdio.h> #include <stdlib.h>  int main(void) { int a; int f[1000000]; sleep(1);  scanf("%d",&a);  printf("%d %d ",a/10,a%10);  return 0; }   

Luego, compile esto a algunos main.exe y hago en las operaciones del programa de verificación del artículo

  pid = fork(); if (pid == 0)  {     struct rlimit rlim;     rlim.rlim_cur = rlim.rlim_max = TIME_LIMIT;     setrlimit(RLIMIT_CPU, &rlim);     execv("./main.exe",NULL); } else  {         struct rusage resource_usage;         // set arbitrary lower limit value of memory used         int memory_used = 128;         pid_t pid2;          do {             memory_used = max(memory_used, get_memory_usage(pid));             if ((memory_used > memory_limit)                 kill(pid, SIGKILL);             // wait for the child process to change state             pid2 = wait4(pid, &status, WUNTRACED | WCONTINUED, &resource_usage);         } while (pid2 == 0); }   

y función get_memory_usage() del artículo

  int get_memory_usage(pid_t pid) {     int fd, data, stack;     char buf[4096], status_child[NAME_MAX];     char *vm;      sprintf(status_child, "/proc/%d/status", pid);     if ((fd = open(status_child, O_RDONLY)) < 0)         return -1;      read(fd, buf, 4095);     buf[4095] = '';     close(fd);      data = stack = 0;      vm = strstr(buf, "VmData:");     if (vm) {         sscanf(vm, "%*s %d", &data);     }     vm = strstr(buf, "VmStk:");     if (vm) {         sscanf(vm, "%*s %d", &stack);     }      return data + stack;     }   

PERO EL PROBLEMA EN CADENA, donde pid2 = wait4(pid, &status, WUNTRACED | WCONTINUED, &resource_usage); . while Haz solo una iteración y espere a los extremos de proceso. Pero necesito calcular la memoria y 9988777667 No me dé esta información. ¿Cómo puedo hacer que while funciona mientras el proceso de niño se está ejecutando y se detiene donde se detiene? Hay más problemas con el estado del proceso secundario cuando él zombie. No le da memoria. Necesito atraparlo también. Debido a que para mi main.exe utilizo este programa de prueba:

  main.exe0  

Cuando hago algo de salida de main.exe1111 en Infinite main.exe2 , me muestra todo main.exe3 Salida. Y veo, ese proceso de niño fue

  main.exe4  

y después de eso será

  main.exe5  

Eso significa que el main.exe6 no puede capturar información donde se está ejecutando main.exe.

Original en ingles

I read the article about memory usage calculating in C, and have problem.

I write simple testing program, which could be working more than one second and use more than 1 KB memory.

#include <stdio.h> #include <stdlib.h>  int main(void) { int a; int f[1000000]; sleep(1);  scanf("%d",&a);  printf("%d %d\n",a/10,a%10);  return 0; } 

Then I compile this to some main.exe and do in check program operations from article

pid = fork(); if (pid == 0)  {     struct rlimit rlim;     rlim.rlim_cur = rlim.rlim_max = TIME_LIMIT;     setrlimit(RLIMIT_CPU, &rlim);     execv("./main.exe",NULL); } else  {         struct rusage resource_usage;         // set arbitrary lower limit value of memory used         int memory_used = 128;         pid_t pid2;          do {             memory_used = max(memory_used, get_memory_usage(pid));             if ((memory_used > memory_limit)                 kill(pid, SIGKILL);             // wait for the child process to change state             pid2 = wait4(pid, &status, WUNTRACED | WCONTINUED, &resource_usage);         } while (pid2 == 0); } 

And function get_memory_usage() from article

int get_memory_usage(pid_t pid) {     int fd, data, stack;     char buf[4096], status_child[NAME_MAX];     char *vm;      sprintf(status_child, "/proc/%d/status", pid);     if ((fd = open(status_child, O_RDONLY)) < 0)         return -1;      read(fd, buf, 4095);     buf[4095] = '\0';     close(fd);      data = stack = 0;      vm = strstr(buf, "VmData:");     if (vm) {         sscanf(vm, "%*s %d", &data);     }     vm = strstr(buf, "VmStk:");     if (vm) {         sscanf(vm, "%*s %d", &stack);     }      return data + stack;     } 

But the problem in string, where pid2 = wait4(pid, &status, WUNTRACED | WCONTINUED, &resource_usage);. while make only one iteration and wait for process ends. But I need to calculate memory, and rusage resource_usage don't give me this info. How can I make than while works while the child process is running and stops where he stops. There are more problems with status of child process when he ZOMBIE. It doesn't give a memory. I need catch it too. Because if for my main.exe I use this test program:

#include <stdio.h> #include <stdlib.h>  int main(void) {    int a;    int f[1000000];    sleep(1);    scanf("%d",&a);    printf("%d %d\n",a/10,a%10);    return 0; } 

When I do some output from get_memory_usage in infinite while, it shows me all /proc/[pid]/status output. And I see, that child process was

Name:   check.exe State:  R (running) 

and after that it will

Name:   main.exe State:  Z (zombie) 

That means the proc can't catch information where main.exe is running.

           
 
 

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

De acuerdo con la Waitpid () Página de Man, su llamada a wait4() bloques hasta que el proceso se detiene, o se reanuda nuevamente después de haber sido detenido. Esto no es lo mismo que el bloqueo de la entrada de la espera, significa que se ha detenido por una señal ( SIGSTOP ).

Lo que necesita es WNOHANG que detiene su wait4() de bloquear y hace que regrese de inmediato, como esto:

  JclMime0  

nb No he probado lo anterior en absoluto, o incluso lo compilé.

 

According to the waitpid() man page, your call to wait4() blocks until the process is stopped, or resumed again after having been stopped. This is not the same as blocked waiting for input, it means it has been stopped by a signal (SIGSTOP).

What you need is WNOHANG which stops your wait4() from blocking and causes it to return immediately, provbably like this:

do  {    // All the stuff you want to do    pid2 = wait4(pid, &status, WNOHANG, &resource_usage); } while (pid2 == 0); 

NB I haven't tested the above at all, or even compiled it.

 
 
       
       

Relacionados problema

62  ¿Cómo compartir la memoria entre los procesos creados por Fork ()?  ( How to share memory between processes created by fork ) 
En la horquilla, si modificamos una variable global, no se cambiará en el programa principal. ¿Hay alguna manera de cambiar una variable global en la horqui...

7  Punto muerto con rebaño, tenedor y terminando el proceso padre  ( Deadlock with flock fork and terminating parent process ) 
Tengo un programa Python Python bastante complicado. Internamente tiene un sistema de registro que utiliza un exclusivo ( LOCK_EX1 ) fcntl.flock para admini...

-1  Apple / BSD: estado = 2943 de waitepid?  ( Apple bsd status 2943 from waitpid ) 
Soy Ptrace'ing un proceso. Después de la horquilla / EXECL y luego un wait en el niño, estoy obteniendo un estado de 2943. Estoy probando el fracaso, pero ...

9  Implementar tuberías ("|") usando c .. (tenedor usado)  ( Implement piping using c fork used ) 
sample0 Si doy el argumento de la línea de comandos como "ls grep .c" Debería obtener todos los archivos ".c" que se muestran. Pseudocódigo: - Mi proces...

3  ¿Cómo puedo ser notificado cuando un proceso de fondo termina en Perl?  ( How can i be notified when a background process terminates in perl ) 
Escribí un programa PERL que cuida y llama un programa de antecedentes en el proceso secundario y tiene un interminable mientras hace algunas cosas en el proc...

4  LUA FORK Procesos concurrentes  ( Lua fork concurrent processes ) 
Quiero ejecutar procesos de fondo simultáneamente de un script de LUA como: a = io.popen("deploy.exp" .. ip1):read("*a") b = io.popen("deploy.exp" .. ip2...

19  ¿Cómo matar al niño del tenedor?  ( How to kill child of fork ) 
Tengo el siguiente código que crea un horquilla para niños. Y quiero matar al niño antes de que termine su ejecución en el padre. ¿Cómo hacerlo? #include <...

2  Fork () no funciona para calcular los últimos dígitos de los argumentos de la línea de comandos  ( Fork not working to calculate last few digits of command line arguments ) 
Estoy tratando de calcular la suma total de una línea de argumentos de comando ingresados ​​desde el terminal. Hasta el momento, he llegado al punto en que im...

2  Espere el proceso del niño sin liberar sus recursos  ( Wait for child process without freeing its resources ) 
Estoy buscando una manera de acceder a la tarea de la tarea del niño desde el padre cuando el niño está a punto de terminar, o acaba de terminar. La razón por...

18  Proceso de hijo múltiple  ( Multiple child process ) 
¿Puede alguien ayudarme sobre cómo crear múltiples procesos secundarios que tienen el mismo padre para hacer "algunas" parte del trabajo en particular? Por ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos