In un progetto basato su Linux su cui sto lavorando, devo essere in grado di trovare tutti i miei processi figli. Non è possibile registrare ogni volta che si inizia: devono essere trovati dopo il fatto. Questo deve essere puro C, e mi piacerebbe farlo senza leggere/proc. Qualcuno sa come fare questo?Come trovare tutti i processi figli?
risposta
trovo il tuo commento che non è FEA è possibile registrare la creazione di processi per essere dispari, ma se proprio non si può (forse perché non si sa quanti ne verranno creati e non si vuole mantenere la memoria realloc
), probabilmente aprirò tutti i file che corrispondono al glob /proc/[1-9]*/status
e cercare la riga che dice PPid: <num>
dove <num>
era il mio ID di processo.
Ha detto che voleva farlo senza leggere/proc ... – Polaris878
E poi ha accettato la mia risposta, quindi credo che abbia cambiato idea dopo aver visto quanto sarebbe stato facile. –
Un motivo perfettamente giusto per cui potresti non essere in grado di registrare la creazione di ogni processo figlio: se sai che un fork di librerie viene elaborato e non ti dà i PID. – tomjakubowski
È possibile analizzare un elenco di processi (ps -ax?) Che include l'ID del processo principale. Questo potrebbe probabilmente essere fatto con un semplice script di shell.
È possibile utilizzare popen
Qualcosa come. (Speriamo che la sintassi è abbastanza vicino)
#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, stessa risposta di sangretu. –
Byron, ti ho votato perché probabilmente hai la migliore risposta per la domanda ora che ps non è un'opzione. Però, spero che non mi abbia votato b/c la mia risposta è la stessa di sangretu con più dettagli. Eravamo a 2 minuti di distanza e mi ci è voluto tempo per scrivere lo pseudo-codice iniziale. Da allora ho modificato per fornire un codice più dettagliato che funzioni. –
Grazie, bel codice. –
solito è del tutto possibile per registrare processi figli ogni volta che si avvia uno. convenientemente, il processo padre viene passato il valore pid del processo figlio come valore di ritorno della chiamata a forcella che lo crea.
come pagina man dice:
pid_t fork(void);
Sarebbe utile se ci si potrebbe dire perché si pensa che non è fattibile.
Ho pensato che avesse una buona ragione. Ma hai ragione. Di solito è piuttosto banale ottenere queste informazioni. – sangretu
Se si vuole tracciare gli eventi forcella ed estrarre pid bambini a scopo di debug, ci sono una serie di modi per farlo, tra cui:
- Utilizzando GDB
- usando strace
- Utilizzando systemtap
- tramite connettori eventi del kernel (non so cosa si tratta esattamente)
Si potrebbe provare questo
#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: Questo pezzo di codice deve essere nel processo padre
Fondamentalmente ps -o pid --ppid <parent_id>
dà il PID di tutti i processi figli il cui genitore ha PID. Ora, possiamo ottenere il PID del processo del genitore usando il getpid(), che restituisce pid_t
e viene convertito implicitamente in un integer.sprintf lo converte in una stringa e concateniamo il risultato con str
per ottenere il comando completo che viene eseguito da system()
'system (str)' mostra l'output alla console e voglio anche che tutti gli id in un array –
Se si sta cercando di ottenere tutti i processi figli per lo scopo ben preciso di aspettare per loro di uscire, è possibile utilizzare waitpid (-1, ...):
while (true) {
// Wait for any child exiting
int child_status;
const int child_pid = waitpid(-1, &child_status, 0);
// check child_status
}
Posso usare la tua soluzione per mostrare lo stato del processo in background nella mia shell. Ma quando il ciclo si interrompe? – alhelal
- 1. Come si elencano tutti i processi figli in python?
- 2. Avere Supervisord Riavvia periodicamente i processi figli
- 3. Come tracciare tutti i file aperti da un processo e i suoi processi figli?
- 4. Come pulire i processi figli su child_process.spawn() in node.js
- 5. Come posso prevenire i processi figli di zombie?
- 6. Come calcolare l'utilizzo della CPU di un processo e tutti i suoi processi figli in Linux?
- 7. Come eliminare tutti i processi figlio all'uscita?
- 8. Come ottenere tutti i processi in un display da Xvfb?
- 9. jQuery: Come seleziono tutti i figli P di mio padre?
- 10. Attesa del genitore per tutti i processi figlio
- 11. Come posso fare in modo che Perl aspetti i processi figli avviati in background con system()?
- 12. elencando tutti i processi in iOS 5.0.1
- 13. Come tutti i figli di un genitore utilizzando Query MSSQL
- 14. Pycharm: termina tutti i processi in esecuzione
- 15. Come trovare tutti i processi SQL Agent che chiamano un dato stored-proc
- 16. Come selezionare tutti i root o tutti i nodi figli in VirtualStringTree?
- 17. Trova tutti i processi figli del mio processo .NET/scopri se un dato processo è un mio figlio?
- 18. ActiveRecord trova tutti i genitori che hanno figli associati
- 19. Come uccidere tutti i processi con un determinato nome parziale?
- 20. Come uccidere tutti i processi in background in zsh?
- 21. Come posso terminare tutti i processi di subshell?
- 22. Come si eliminano tutti i processi in Mysql "show processlist"?
- 23. Come trovare tutti i costruttori statici?
- 24. come ottenere tutti i processi parent e tutti i sottoprocessi mediante `pstree`
- 25. jQuery ottiene l'elemento successivo e tutti i relativi figli
- 26. Selezionare una proprietà genitore e tutti i figli utilizzando linq
- 27. Emettere segnale se tutti i widget figli perdono fuoco
- 28. Elimina tutti i processi per un dato utente
- 29. Come analizzare i nodi figli?
- 30. Ottenere tutti i figli della collezione con has_many relationship
Con 'puro C' Ero un po 'inclusivo di' non analizzare l'output del comando '. – c4757p
Perché non è fattibile? Questo è di gran lunga il modo più pulito ed efficiente per farlo. – Duck
Sei contrario alla scrittura di un LKM che sovrascriverà una delle chiamate di sistema inutilizzate?Se è così, sarebbe banale scrivere una piccola chiamata di sistema che lo farà per te. – FreeMemory