2010-03-24 5 views
3

ntdll과 interop'ing하여 Windows에서 하위 프로세스 목록을 가져 오는 코드는 다음과 같습니다. Linux에 'NtQueryInformationProcess'와 동일한 기능이 있나요? (pbi.InheritedFromUniqueProcessId와 같은) 지정된 프로세스의 부모 프로세스 ID가 나옵니까? Mono를 통해 Linux에서 실행되는 코드가 필요하므로 코드가 Windows와 거의 동일하게 유지되도록 부모 프로세스 ID를 얻는 부분 만 변경하면되기를 바랍니다. 리눅스에서 주어진 프로세스의 모든 아이들을 찾는C#/mono : Windows 및 Linux에서 하위 프로세스 목록 가져 오기

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; 
    } 

답변

4

한 가지 방법은 foreach는 내부에 이런 일을하는 것입니다 : 무엇을/proc 디렉토리/[ID]에 대한 자세한 내용은

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 
    } 
} 

/stat에 대한 내용은 'proc'매뉴얼 페이지를 참조하십시오. 파일을 열기 전에 프로세스가 죽을 수도 있기 때문에 '사용'주위에 try/catch를 추가해야합니다 ...

+0

감사!/proc 파일 시스템을 생각하지 마라! 시스템 호출 만 찾고 있었지만이 솔루션은 좋은 점이 있습니다. – johnrl

0

사실, 프로세스 이름에 공백이 있으면 곤잘로의 대답에 문제가 있습니다. . 이 코드는 날 위해 사용할 수 :

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; 
}