Odpověď na názor

Odpovídáte na názor ke článku Temná strana linuxu - spouštění procesů.

  • 23. 1. 2012 13:50

    klusacek (neregistrovaný)

    'Zvedněte ruku, kdo tohle někdy řešil?' --- zvedam ruku. A rozcarovan jsem z toho byl podobne, vcetne toho problemu jak se dozvedet ze selhal exec (to jsem nakonec nevyresil, jen pred forkem testuju ze dany soubor existuje, ale to neni idealni protoze ho nekdo mezitim muze smazat a taky kdyz na zacatku chce interpretr jako treba #/bin/bash a ten by nahodou neexistoval tak to velice zahadne selze --- v takovem pripade po forku uz exit()nu z celeho programu).

    Mam nasledujici `API':

    int run(char* direcory, int* filedes, char* command, ...)

    kde directory je adersar ve kterem bude program spusten, filedes je pole deskriptoru, ktere budou zachovany (a remapovany na nejnizsi cisla), command je format string prikazu, kde se argumenty oddeluji specialnim znakem takze je mozne napsat treba

    run(".", (int[]){0,1,2, pd[1],-1}, "prog01%s01%s", arg1, arg2);

    a ono to spusti prog arg1 arg2 propojeny s mym programem pres pd[1] (on ho ma na deskriptoru
    3) a zbytek ma obvykly stdin/stdout.

    Delal jsem to pomoci /proc/PID/fd, coz je adresar ve kterem jsou vsechny otevrene deskriptory videt jako soubory, takze je mozne je postupne probrat a pozavirat, ty ktere nechci zavrit pred tim zduplikovat a nakonec je zduplikovat na zacatek (protoze ty puvodni jsou zavrene) a docasnych duplikatu se zbavit. Ale ma to taky nevyhodu, pokud ma spusteny proces mode 711 a je vlastnen rootem a ten kdo ho spusti je non-root tak tento adresar nejde precist.