nahrada volani system() pomoci exec s presmerovanim

Pavel Kankovsky peak na kerberos.troja.mff.cuni.cz
Úterý Duben 28 10:25:29 CEST 1998


On Mon, 27 Apr 1998, Petr Skoda wrote:

> Warning: dev (04:41) tty->count(1) != #fd's(2) in tty_open
> Warning: dev (04:41) tty->count(1) != #fd's(2) in release_dev
> rs_close: bad serial port count; tty->count is 1, info->count is 2
> Warning: dev (04:41) tty->count(1) != #fd's(2) in release_dev
> rs_close: bad serial port count; tty->count is 1, info->count is 0
> release_dev: bad tty->count (-1) for ttyS1

Ted si vzpominam, ze jsem to parkrat videl se starsim kernelem na
pseudoterminalech. Vyznam hlasky je ten, ze citac pocitajici, kolikrat je
urcity jaderny objekt pouzivan, nesouhlasi se skutecnosti. Procez
doporucuji aktualizovat jadro.

> main(argc,argv)
> {
>   struct timeval tvm;
>   int retvalm;
>   FILE *fp1;
> 
>         while(1)
>         {
>         fp1=fopen("/home/nassystem/comfile","rt");
>         if(fp1==NULL)
>          { /*fprintf(stderr,"Error open comfile for read \n")*/;}

Tady by bylo docela pekne dat nejake cekani, aby zbytecne nezhavil
procesor.
>          else
>          {
>           fclose(fp1);
>           system("/usr/local/bin/radic </home/nassystem/comfile");
>           tvm.tv_sec=0;
>           tvm.tv_usec=200000;
>           retvalm=select(1,NULL,NULL,NULL,&tvm);

To, jak se zbavit system() tady uz nekdo popisoval, takze nebudu nosit
drivi do lesa. Nicmene mam dotaz: umi si "radic" poradit s cr/lf?

>           system("rm /home/nassystem/comfile");

Jezisi Kriste, proc lidi delaji tohle? (co je spatne na
unlink(jmeno_souboru)?)
> 
>          }
>       } 
> 
> - Jeste jsem vypozoroval, ze to tuhne podstatne mene, pokud je
> soubor comfile kratky - napr jen 1 prikaz, cim delsi, tim vic to tuhne
> (ten program radic ma taky nejake cekacky na vysypani na port apod, ale
> kdyz to spustim primo : 
>
> radic < nejaky soubor  
> 
> vykona bez problemu libovolne dlouhy seznam prikazu, takze asi je chyba v
> tom volani toho demona executor.

Aha. A jak je mu predkladan ten soubor. Je to tak, ze je nejdrive vyroben
pod jinym jmenem, a pak, kdyz je hotovy, prejmenovan? Pokud ne, tak je to
klasicka race condition: "executor" zjisti, ze soubor existuje a spusti
program "radic" nad souborem, ktery jeste nemusi byt hotovy, a pak se deji
veci...


--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]



Další informace o konferenci Linux