nahrada volani system() pomoci exec s presmerovanim

Petr Skoda skoda na sunstel.asu.cas.cz
Pondělí Duben 27 21:09:10 CEST 1998


Dobry vecer vespolek,

prosim o radu s takovym zapeklitym problemem -
mame tady jakysi stroj (detaily vynecham pro strucnost - je to dodavka od
jiste male firmy) ktery komunikuje pres seriovy port, kamz posila
jednoduche kratke textove prikazy (bez handshake). Obsluzny program se
vola (nazyvejme ho radic)

radic unit=value   (tedy  napr FM=1)

radic -i        pak pracuje interaktivne a zobrazuje stavy tech unit 



To bezi na linuxu. Jelikoz jsme potrebovali jednoduse ovladat ta zarizeni
z jinych systemu a hlavne DOSu (pod TP55) udelalo se toto:

Je demon rekneme executor ktery bezi a hlida si jisty textovy soubor
rekneme

/home/nassystem/comfile


Pokud se takovy soubor objevi, vola demon funkci system (), volajici nas
radic s presmerovanym vstupem ze souboru comfile Pak ceka asi 200ms
(volanim select) a soubor vymaze. 

Takze ja mam namountovane pres MSDOS NFS (PCTCP idrive) ten adresar
a chci-li vydat povel, prejmenuju pod dosem nejaky pracovni soubor
tempfile na comfile. Demon executor prikazy vyvola volanim radice a soubor
vymaze atd.

Je mi jasne, ze je to systemove priserne reseni, ale kdysi to chodilo
celkem dobre a nic lepsiho jsme kvuli tomu DOSu nevymysleli (ono nejde jen
o to poslani - to by zvladl i rsh, ale zaroven jiny demon na ten
exportovany adresar pise do jineho souboru pravidelne vycitane stavy
jednotek ctenim jineho serioveho portu)

No a ted problem: Bezelo to krasne pod RH4.1. Kdyz jsem presel na RH5.0 se
vsemi updaty (z Yenova CD), tak to velice rychle zatuhne po par pokusech 
- ten soubor comfile se nevymaze a cele to visi.

Na konsoli se pritom napisou hlasky (uz to tu psal nedavno kolega Honsa,
ale bez vysvetleni)

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
 

coz mozna  souvisi se zahlcenim toho komunikacniho radice (moc tomu
nerozumim ale tyhle hlasky jsou v jadre v drivers/char/serial.c)

Ale co je jine mezi Rh4.1 a RH5.0 je dodatek man system, hlasajici, ze 
system v libc nebyl prerusitelny a doporucuji jakesi volani fork a exec,
tazke asi v glibc prerusitelny je. Mozna, ze proto to drive netuhlo
ale to jsou dohady .


A ted prosba - umel by nekdo poradit jak se zbavit toho volani system()
pomoci shellu a presmerovani aby se volala jen ta binarka ( ale neni mi
jasne jak vnutit funkci exec() jako argument to presmerovani ),
nebo jeste lepe nejake korektni reseni pri zachovani moznosti vytvor
soubor s prikazy zevne, vykonej, vymaz. 

Prikladam cast zdrojaku aby to bylo jasne. Nejde mi nejake velke teorie,
potrebuji to rozchodit co nejdrive (vcera bylo pozde), jinak me sef donuti
reinstalovat RH4.1, coz bych hrozne nerad (a navic, neni jasne, ze to
jeste pujde)

kod pro executor: (bez hlavicek include)

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")*/;}
         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);
          system("rm /home/nassystem/comfile");

         }
      } 

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


Budu velmi vdecen za kazdy napad - BTW nema nekdo nejake ukazky jak
obsluhovat zarizeni na seriovem portu (linux programming manual v LDP ma
jen pul stranky bez detailu a jeste krypticke)


************************************************************************* 
*  Petr Skoda                         Tel   : (0204) 649201, l. 361     * 
*  Stelarni oddeleni                          (0204) 620361, 620136     *
*  Astronomicky ustav AVCR            Fax   : (0204) 620250             *
*  251 65 Ondrejov                    e-mail: skoda na sunstel.asu.cas.cz  *
*  Ceska republika                            pskoda na mbox.cesnet.cz     *
*************************************************************************





Další informace o konferenci Linux