argv[0]

Patrik Ostrihon pa3k na pa3k.sk
Čtvrtek Duben 3 18:18:25 CEST 2003


Dňa Št, 2003-04-03 at 10:29, Petr Stehlik napísal:
> 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.

Teoreticky je pouzitelje #ifdef... pre prislusnu platformu tu funkiu
napisat zvlast ?

 
> 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].

Tak ako to popisujete by sa to v ziadnom pripade nemalo spravat.
Skusili ste si to trejsnut :) (strace) konkretne:

strace -o stace.log -f /cesta_k_prvej_binarke/prva_binarka 

> *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);

result ziskate jedine ked exec neprebehne uspesne. Pokial exec prebehne
uspesne, tak riadok za exec sa uz nikdy nevykona. Pokial exec zlyha tak
vrati tusim vzdy -1. Mam daky dojem, ze navratovy kod je len cele cislo
v rozsahu 0-255 a -1 v exite sa vam premietne ako 255. Dovod preco sa
nevykonal najdete v errno. (neviem ci vyssie bity sa nenastavuju ked bol
proces ukonceny "abnormalne" napr. signalom ale to by som si musel
pozriet (bohuzial cas nedovoluje :) )

Skuste si vyskusat:

main()
{
   exit(-1);
}

a pripadne

main()
{
   exit(257);
}

prelozit a potom spustit

./a.out ; echo $?



> }
> 
> int status;
> waitpid(pid, &status, 0);
 
Co ked syn skonci skor ako sa Vam vykona waitpid?
Ide o to, ze syn posle signal SIGCHLD, defaultne sa ignoruje, toto
nastavenie sa ale dedi od predka, takze pre istotu by som doporucil:

signal(SIGCHLD, SIG_IGN);


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

skuste ten strace uvidite, vratit by sa to malo

-- 
Patrik Ostrihon
Technicky riaditel
ProWeb Consulting, a.s.
Werferova 1, 040 11  Kosice
Tel./fax: 055 / 7898 401
Navstivte nas na: www.pwc.sk




Další informace o konferenci Linux