Seite 1 von 2

[WIN|LIN] Namen des Parent-Prozesses ermitteln

Verfasst: 03.02.2010 23:26
von X0r
Die Idee habe ich von hier: http://www.codeproject.com/KB/threads/ParentPID.aspx
(Nochmal Danke an TomS, der mir den Link zu dieser Seite geschickt hat)

Für Windows:

Code: Alles auswählen

EnableExplicit

Procedure.s GetProcessName(ProcID.i)
  Protected hSnap, ProcEntry.PROCESSENTRY32, result.s
  
  hSnap=CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  If hSnap
    ProcEntry\dwSize=SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap,@ProcEntry)
      Repeat
        If ProcID=ProcEntry\th32ProcessID
          result=PeekS(@ProcEntry\szExeFile,260,#PB_Ascii)
          Break
        EndIf
      Until Not Process32Next_(hSnap,@ProcEntry)
    EndIf   
    CloseHandle_ (hSnap)
  EndIf
  ProcedureReturn result
EndProcedure


Procedure.s GetParentProcessName()
  Protected hSnap, ProcEntry.PROCESSENTRY32, cProcID=GetCurrentProcessId_(), result.s
  
  hSnap=CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  If hSnap
    ProcEntry\dwSize=SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap,@ProcEntry)
      Repeat
        If cProcID=ProcEntry\th32ProcessID
          result=GetProcessName(ProcEntry\th32ParentProcessID)
          Break
        EndIf
      Until Not Process32Next_(hSnap,@ProcEntry)
    EndIf   
    CloseHandle_ (hSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Debug GetParentProcessName()
Für Linux (von Marvin):

Code: Alles auswählen

Procedure.s GetParentProcessName()
    fd = ReadFile(-1, "/proc/" + Str(getppid_()) + "/status")
    If Not fd
        ProcedureReturn ""
    EndIf
    Repeat
        line.s = ReadString(fd)
        If Left(line, 5) = "Name:"
            CloseFile(fd)
            ProcedureReturn Mid(line, 7)
        EndIf
    Until Eof(fd)
    CloseFile(fd)
    ProcedureReturn ""
EndProcedure

OpenConsole()
PrintN("Parent: " + GetParentProcessName())

Re: [WIN] Namen des Parent-Prozesses ermitteln

Verfasst: 03.02.2010 23:55
von Josh
nice, aber unicodeunterstützung wäre vieleicht noch ganz gut :)

Re: [WIN] Namen des Parent-Prozesses ermitteln

Verfasst: 04.02.2010 19:11
von Marvin
So, und jetzt das ganze für Linux:

Code: Alles auswählen

EnableExplicit

Procedure.s GetParentProcessName()
    Protected.l fd
    Protected.s line
    fd = ReadFile(-1, "/proc/" + Str(getppid_()) + "/status")
    If Not fd
        ProcedureReturn ""
    EndIf
    Repeat
        line.s = ReadString(fd)
        If Left(line, 5) = "Name:"
            CloseFile(fd)
            ProcedureReturn Mid(line, 7)
        EndIf
    Until Eof(fd)
    CloseFile(fd)
    ProcedureReturn ""
EndProcedure

OpenConsole()
PrintN("Parent: " + GetParentProcessName())
EDIT: EnableExplicit

Re: [WIN] Namen des Parent-Prozesses ermitteln

Verfasst: 04.02.2010 20:14
von - chris -
Mit unicodeunterstützung

Code: Alles auswählen

EnableExplicit

Procedure.s GetProcessName(ProcID.i)
  Protected hSnap, ProcEntry.PROCESSENTRY32, result.s

  hSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If hSnap
    ProcEntry\dwSize = SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap, @ProcEntry)
      Repeat
        If ProcID = ProcEntry\th32ProcessID
          CompilerIf #PB_Compiler_Unicode
            result = PeekS(@ProcEntry\szExeFile, 260, #PB_Unicode)
          CompilerElse
            result = PeekS(@ProcEntry\szExeFile, 260, #PB_Ascii) 
          CompilerEndIf   
          Break
        EndIf
      Until Not Process32Next_(hSnap, @ProcEntry)
    EndIf
    CloseHandle_(hSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Procedure.s GetParentProcessName()
  Protected hSnap, ProcEntry.PROCESSENTRY32, cProcID, result.s

  cProcID = GetCurrentProcessId_()

  hSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If hSnap
    ProcEntry\dwSize = SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap, @ProcEntry)
      Repeat
        If cProcID = ProcEntry\th32ProcessID
          result = GetProcessName(ProcEntry\th32ParentProcessID)
          Break
        EndIf
      Until Not Process32Next_(hSnap, @ProcEntry)
    EndIf
    CloseHandle_(hSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Debug GetParentProcessName()

Re: [WIN] Namen des Parent-Prozesses ermitteln

Verfasst: 05.02.2010 01:54
von X0r
Sorry - chris -,
aber mein Code läuft auch im Unicode-Modus perfekt, deiner hingegen fehlerhaft.

@Marvin: Hab deinen Code mal meinem 1. Beitrag hinzugefügt. :D
(Wäre aber noch gut, wenn du ihn den hier im Unterforum erwünschten Standards anpassen würdest. Oder soll ich das machen?)

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Verfasst: 05.02.2010 18:55
von Marvin
X0r hat geschrieben:Hab deinen Code mal meinem 1. Beitrag hinzugefügt.
Ohne, dass ihn jemand außer mir getestet hat? Na, viel Glück. :mrgreen:
X0r hat geschrieben:(Wäre aber noch gut, wenn du ihn den hier im Unterforum erwünschten Standards anpassen würdest. Oder soll ich das machen?)
Meinst du die Einrückung? Na ja, in deinem Post kann ich das ja sowieso nicht anpassen, und für meinen müsste ich erstmal wissen, was genau du meinst. :wink:

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Verfasst: 05.02.2010 20:25
von Kiffi
Marvin hat geschrieben:und für meinen müsste ich erstmal wissen, was genau du meinst. :wink:
ne ordentliche Deklaration Deiner Variablen wäre schon
mal ein Schritt in die richtige Richtung ;-)

Grüße ... Kiffi

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Verfasst: 05.02.2010 20:29
von X0r
ne ordentliche Deklaration Deiner Variablen wäre schon
mal ein Schritt in die richtige Richtung ;-)
Jo. Und auch dieser Teil des Codes ist etwas fragwürdig:

Code: Alles auswählen

If Not fd
        ProcedureReturn ""
    EndIf
Das kannste cleverer lösen. :wink:

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Verfasst: 05.02.2010 22:45
von Marvin
X0r hat geschrieben:Das kannste cleverer lösen. :wink:
Hm, da steh ich auf dem Schlauch... NULL zurückgeben? RaiseError(#PB_OnError_Breakpoint)?

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Verfasst: 06.02.2010 11:03
von X0r
Hm, da steh ich auf dem Schlauch... NULL zurückgeben? RaiseError(#PB_OnError_Breakpoint)?
:mrgreen: ?
Es reicht doch einfach, wenn du

Code: Alles auswählen

if fd
schreibst.

Zudem ist es auch nicht ganz elegant, mitten in der Schleife ProcedureReturn und nochmal CloseFile zu schreiben. Das kannst du ebenfalls cleverer lösen. Schau dir mal meinen Code an.