nahrada volani system() pomoci exec s presmerovanim
Petr Skoda
skoda na sunstel.asu.cas.cz
Středa Duben 29 13:42:41 CEST 1998
On Tue, 28 Apr 1998, Pavel Kankovsky wrote:
> > 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.
Je to standardni RH5.0 z Yenyovy CDR distribuce (palene na Cikhaji)
tedy jadro 2.0.32 verze #1 Wed Nov 19 00:46:45 EST 1997
Je tedy spatne prave v oblasti seriove komunikace ? - tedy je ona hlaska
normalni pri aktivite portu (u mysi zrejme ne)?
>
> > 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.
jeste jine cekani nez onech 200ms uvedenych dole volanim
select ?
> > 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?
>
ANo, to uz jsem implementoval (a precetl si par knizek - kapitolu fork,dup
apod)
Ohledne cr/lf - to je zajimave - ja je pisu v DOSU do souboru montovanem z
linuxu - tedy CRLF, ale kdyz se na ne divam na linuxu - jsou bez meziradky
tedy unixove - asi to dela ten NFS driver pod dosem. Ale stejne tak to
testuju primo v linuxu - vytvorim pomocny comfile pod vi a zkopiruju
na vlastni comfile pomoci cp , nebo rovnou mv.
> > system("rm /home/nassystem/comfile");
>
> Jezisi Kriste, proc lidi delaji tohle? (co je spatne na
> unlink(jmeno_souboru)?)
Uz jsme to taky predelali na remove() - BTW jaky je rozdil mezi remove a
unlink ? Man page jsou temer doslova stejne s rozdilem #include knihovny
stdio vs. unistd. - Co je co ?
> >
> > }
> > }
>
> Aha. A jak je mu predkladan ten soubor. Je to tak, ze je nejdrive vyroben
> pod jinym jmenem, a pak, kdyz je hotovy, prejmenovan? P
ANO tak - v linuxu mezisoubor kopiruji, ci mv (chova se co do tuhnuti
stejne - statisticky vzato) Pod dosem volam Rename v TP5.5 na NFS
mountovany.
Pokud to nekomu bude uzitecne uvedu nase zatim konecne reseni:
#define COMFILE "/home/nassystem/comfile"
#define RADIC "/usr/local/bin/radic"
main(argc,argv)
{
int fp1;
while(1)
{
if (fp1=open(COMFILE, O_RDONLY) > 0) {
close(fp1);
if (fork()==0){
if (fp1=open(COMFILE, O_RDONLY) > 0) {
close(0);
dup(fp1);
close(fp1);
execl(RADIC, "radic", NULL);
}
}
wait(NULL);
remove( COMFILE );
}
usleep(200000);
}
}
Zda se, ze to tuhne min, ale stejne .
Jeste zkusime s kolegou presunout vykonnou cast programu radic (tu ktera
rozpoznava prikaz z COMFILE a posila patricne kody na seriovy port) primo
do programu EXECUTOR, aby se vubec nevolal dalsi program.
Kdyz vidim, ze je o nas problem zajem (uz 2 lide pomohli), rad bych ten
problem jeste rozsiril o cast zpusobu komunikace na seriovem portu-
protoze by to mohlo asi zajimat vice lidi poslu to s novym subjektem.
*************************************************************************
* 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