argv[0]

Petr Stehlik pstehlik na sophics.cz
Čtvrtek Duben 3 10:29:19 CEST 2003


On St, 2003-04-02 at 21:20, Patrik Ostrihon wrote:
> skuste si precitat http://www.advancedlinuxprogramming.com/

Diky za tip.

> riesenie vaseho problemu:

bohuzel prilis linux specific. Zapomnel jsem napsat, ze ten muj kod by
mel bezet na vsem aspon vzdalene podobnem unixu.

Mimochodem, cast toho hacku s argv[0] byla o tom, ze potrebuju spustit
(pod)program a zjistit, jak dopadl. Kdyz jsem ho ale spoustel pomoci
execvp("jmeno") (nemusel jsem znat cestu k nemu, execvp hleda v $PATH),
tak v pripade, ze nikde nebyl nalezen, to cele nejak vytuhlo a waitpid()
(*1) se nikdy nedockal. Abych toto vyresil, musel jsem prejit na
execv("/cesta/jmeno") a existenci si predem overuji pomoci
stat("/cesta/jmeno"). Pokud bych vyresil ten 'vytuh', mohl bych se
vratit k execvp a vyresit tak pulku toho argv[0].

*1: kod vypada zhruba takto (pozor - rucne jsem ho upravil pro ucely
konference, nemusi to byt zkompilovatelne):

int pid = fork();
if (pid < 0) {
    return false;
}

if (pid == 0) {
    char *args[] = {...}
    int result;
    result = execvp( "name", args );
    ::exit(result);
}

int status;
waitpid(pid, &status, 0);

Klicove je, ze ten waitpid se nikdy nedocka, pokud execvp nenajde
program ke spusteni. Pripada mi, ze se ten execvp vubec nevrati. Coz je
naopak nez tvrdi 'man execvp'. Nevim, kde mam jakou chybu.

Petr




Další informace o konferenci Linux