Názor ke článku Temná strana linuxu - spouštění procesů od Ondřej Novák - @2 Problém je, že si nejsem jist, jestli...

  • 23. 1. 2012 9:01

    Ondřej Novák (neregistrovaný)

    @2 Problém je, že si nejsem jist, jestli opravdu dneska je možné psát multiplatformě pro všechny linuxy, které jsou k mání. O psaní na další Unixy už ani neuvažuju. Proto jsem problém uchopil tak, že stavím své knihovny na základe předem daných user stories. V tomto případě je to požadavek na spouštění procesů, synchronizaci s nimi a základní komunikaci (roury). Je mi v celku jedno, co je na implementaci, jestli mám pro každou verzi linuxu vlastní komplet implentaci, nebo to mám v posixu, nebo prasácký zdroják plný ifdef endif

    Na clone se podívám, ale pokud je vfork jen alias pro příkaz clone s určitými příznaky, tak by to mělo stačit.

    Čekání na cizí proces, tyhle problémy jsou právě pěkně řešeny ve Windows a stačí se inspirovat. Pokud jeden proces chce čekat na jiný, pak musí jeho PID převést na interní HANDLE (rukojeť) pomocí funkce OpenProcess. Ve funkci uvádí PID procesu a požadovaná oprávnění. V případě čekání na ukončení stačí oprávnění SYNCHRONIZE. Pokud to oprávnění získá, obdrží process HANDLE, se kterým může jít do funkce WaitForSingle­Object. Pokud získá process oprávnění číst exit code, tak si jej lze posléze vyzvednout přes GetExitCodeProcess. Co vím, tak lze takhle čekat i na process běžící pod UAC. Pokud to právo nezíská, nezíská ani HANDLE a pak zbývá jen analýza chyby GetLastError. Pokud je tam ERROR_ACCESS_DE­NIED, tak process běží, pokud je tam ERROR_NOT_FOUND tak už neběží. Ale tohle není moc spolehlivé, protože na uvolněné PID může být v následující milisekundu umístěn jiný process.

    Schopnost synchronizovat se s cizím processem vidím jako důležitou vlastnost třeba u různých služeb či démonů, kdy chci ukončit process, který vlastní třeba nějaký zdroj, který ukončením uvolní.Pokud mě takový process poslechne, pak mám mít právo se dozvědět, že právě skončil.