Domanda

Ho il codice qui sotto per ottenere un elenco di processi figli sulle finestre da interop'ing con ntdll. Esiste un equivalente a 'NtQueryInformationProcess' su Linux, che ottiene sono io l'id del processo del genitore di un processo specificato (come pbi.InheritedFromUniqueProcessId)? Ho bisogno del codice per l'esecuzione su Linux attraverso Mono quindi spero spero ho bisogno di cambiare solo la parte in cui ho l'ID del processo genitore modo che il codice rimane in gran parte la stessa di Windows.

public IList< Process > GetChildren( Process parent )
    {
        List< Process > children = new List< Process >();

        Process[] processes = Process.GetProcesses();
        foreach (Process p in processes)
        {
            ProcessBasicInformation pbi = new ProcessBasicInformation();
            try
            {
                uint bytesWritten;
                NtQueryInformationProcess(p.Handle,
                  0, ref pbi, (uint)Marshal.SizeOf(pbi),
                  out bytesWritten); // == 0 is OK

                if (pbi.InheritedFromUniqueProcessId == parent.Id)
                    children.AddRange(GetChildren(p));
            }
            catch
            {
            }
        }

        return children;
    }
È stato utile?

Soluzione

Un modo di trovare tutti i bambini di un determinato processo in Linux è quello di fare qualcosa di simile dentro il foreach :

string line;
using (StreamReader reader = new StreamReader ("/proc/" + p.Id + "/stat")) {
      line = reader.ReadLine ();
}
string [] parts = line.Split (new char [] {' '}, 5); // Only interested in field at position 3
if (parts.Legth >= 4) {
    int ppid = Int32.Parse (parts [3]);
    if (ppid == parent.Id) {
         // Found a children
    }
}

Per ulteriori informazioni su cosa / proc / [id] / stat contiene, vedere la pagina di manuale di 'proc'. Si dovrebbe anche aggiungere un try / catch in tutto il 'utilizzando' perché il processo potrebbe morire prima di aprire il file, ecc ...

Altri suggerimenti

In realtà, non è un problema con la risposta di Gonzalo, se il nome del processo ha spazi in esso. Questo codice funziona per me:

public static int GetParentProcessId(int processId)
{
    string line;
    using (StreamReader reader = new StreamReader ("/proc/" + processId + "/stat"))
          line = reader.ReadLine ();

    int endOfName = line.LastIndexOf(')');
    string [] parts = line.Substring(endOfName).Split (new char [] {' '}, 4);

    if (parts.Length >= 3) 
    {
        int ppid = Int32.Parse (parts [2]);
        return ppid;
    }

    return -1;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top