En un proyecto basado en Linux en el que estoy trabajando, necesito poder encontrar todos mis procesos hijo. No es factible registrar cada vez que se inicia uno; deben encontrarse después del hecho. Esto necesita ser C puro, y me gustaría hacerlo sin leer/proc. ¿Alguien sabe como hacer esto?¿Cómo encontrar todos los procesos secundarios?
Respuesta
Encuentro su comentario de que no es fea Es posible grabar la creación de procesos para que sea impar, pero si realmente no puede (posiblemente porque no sabe cuántos se crearán y no quiere tener que mantener realloc
en la memoria), entonces probablemente abriría todos los archivos que coinciden con el glob /proc/[1-9]*/status
y busque la línea que dice PPid: <num>
donde <num>
era mi identificador de proceso.
Dijo que quería hacerlo sin leer/proc ... – Polaris878
Y luego aceptó mi respuesta, así que creo que cambió de opinión después de ver lo fácil que sería. –
Una razón perfectamente justa por la cual es posible que no puedas registrar la creación de cada proceso secundario: si sabes que una biblioteca organiza procesos y no te proporciona sus PID. – tomjakubowski
Puede analizar una lista de procesos (ps -ax?) Que incluye el ID del proceso principal. Esto probablemente podría hacerse con un simple script de shell.
Puede usar popen
Algo así como. (Esperemos que la sintaxis es lo suficientemente cerca)
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp = popen("ps -C *YOUR PROGRAM NAME HERE* --format '%P %p'" , "r"); if (fp == NULL) { printf("ERROR!\n"); } char parentID[256]; char processID[256]; while (fscanf(fp, "%s %s", parentID, processID) != EOF) { printf("PID: %s Parent: %s\n", processID, parentID); // Check the parentID to see if it that of your process } pclose(fp); return 1; }
bleh, la misma respuesta que sangretu's. –
Byron, te voté porque probablemente tengas la mejor respuesta para lo que es la pregunta ahora que ps no es una opción. Sin embargo, espero que no me hayas votado por b/c, mi respuesta es la misma que la de sangretu con más detalles. Estábamos separados por 2 minutos y me llevó tiempo escribir el pseudocódigo inicial. Desde entonces he editado para proporcionar un código más detallado que funciona. –
Gracias, buen código. –
Por lo general, es totalmente factible para registrar procesos hijo cada vez que inicie una. convenientemente, el proceso principal pasa el valor pid del proceso hijo como el valor de retorno de la llamada de horquilla que lo crea.
Como la página del manual dice:
pid_t fork(void);
Sería de gran ayuda si usted podría decirnos por qué cree que no es factible.
Supuse que tenía una buena razón. Pero estás en lo correcto. Por lo general, es bastante trivial obtener esa información. – sangretu
Si desea realizar un seguimiento de eventos de horquilla y extraer los PID niño con fines de depuración, hay un número de maneras de hacerlo, incluyendo:
- Usando BGF
- usando strace
- Usando systemtap
- Uso de conectores de eventos del kernel (no sé qué es esto exactamente)
Usted podría intentar esto
#include<string.h>
#include <sys/types.h>
#include <unistd.h>
char str[50] = "ps -o pid --ppid ";
char ppid [7];
sprintf(ppid,"%d",getpid());
strcat(str,ppid);
system(str);
NOTA: Esta pieza de código tiene que estar en el proceso padre
Básicamente ps -o pid --ppid <parent_id>
da el pid de todos los procesos hijo cuyo padre tiene PID. Ahora, podemos obtener el PID del proceso padre utilizando el getpid(), que devuelve pid_t
y se convierte implícitamente en un entero. El formato de archivo lo convierte en una cadena y concatenamos el resultado con str
para obtener el comando completo que se ejecuta mediante system()
¿'system (str)' muestra el resultado en la consola y también quiero que todos los identificadores en una matriz –
Si usted está tratando de conseguir todos los procesos hijo con el propósito muy específico de esperar a que salga, puede utilizar waitpid (-1, ...):
while (true) {
// Wait for any child exiting
int child_status;
const int child_pid = waitpid(-1, &child_status, 0);
// check child_status
}
puedo usar su solución para mostrar el estado del proceso en segundo plano en mi shell. Pero, cuando el loop se rompe? – alhelal
- 1. ¿Cómo se enumeran todos los procesos secundarios en python?
- 2. Encontrar el número de procesos secundarios
- 3. Esperando en PowerShell para que finalicen todos los procesos secundarios
- 4. ¿Cómo encontrar todos los módulos secundarios en Python?
- 5. fork() procesos secundarios y secundarios
- 6. ¿Cómo rastrear todos los archivos abiertos por un proceso y sus procesos secundarios?
- 7. ¿Cómo desactivo los bloques END en procesos secundarios?
- 8. cómo matar procesos y procesos secundarios de python?
- 9. Esperando todos los procesos secundarios antes de que el padre reanude la ejecución UNIX
- 10. desove ya la espera de los procesos secundarios en Python
- 11. Hacer que el comando "Esperar" de Linux espere a TODOS los procesos secundarios
- 12. Tener Supervisord Reiniciar periódicamente procesos secundarios
- 13. mongo DB - Todos los nodos secundarios
- 14. enumerando todos los procesos en iOS 5.0.1
- 15. Determinar todos los elementos secundarios ancho
- 16. Cómo calcular la utilización de CPU de un proceso y todos sus procesos secundarios en Linux?
- 17. fork() y wait() con dos procesos secundarios
- 18. ¿Cómo elimino todos los elementos secundarios usando linq a sql?
- 19. Adjuntar automáticamente depurador vs2005 a procesos secundarios
- 20. ¿Cómo puedo matar todos los procesos en Mysql "show processlist"?
- 21. ¿Cómo puedo desactivar todos los eventos táctiles en todos los elementos secundarios de un ViewGroup?
- 22. ¿Cómo seleccionar todos los nodos raíz o todos los secundarios en VirtualStringTree?
- 23. Python en Windows: ¿cómo esperar varios procesos secundarios?
- 24. Buscar todos los procesos secundarios de mi propio proceso .NET/averiguar si un proceso determinado es hijo propio.
- 25. XPATH: seleccione todos los nodos secundarios con un atributo específico
- 26. Encontrar todos los elementos secundarios para múltiples padres en la consulta SQL simple
- 27. Cómo esperar la salida de procesos no secundarios
- 28. ¿Cómo usar Fork() para crear solo 2 procesos secundarios?
- 29. Seleccionar todos los elementos secundarios recursivamente en CSS
- 30. Retire todos los elementos secundarios de un StackPanel
por 'pura C' Estuve incluyendo "no analizando la salida de comando". – c4757p
¿Por qué no es factible? Esta es la forma más limpia y eficiente de hacerlo. – Duck
¿Se opone a escribir un LKM que anulará una de las llamadas al sistema no utilizadas?Si es así, sería trivial escribir una pequeña llamada al sistema que lo haga por usted. – FreeMemory