Хрестоматия по программированию на Си в Unix




Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 5


char buf[ BSIZE ]; /* буфер для передачи данных */

/* /dev/pty? /dev/ttyp? экран *--------* *--------* /| | | PP.pfd | | |<-STDOUT--| мой |<---------| псевдо |<-STDOUT---| \| |терминал| |терминал|<-STDERR---|трассируемый |(базовый) | | |процесс ------- | | STDIN | | | |.....|-STDIN--> |----------> |--STDIN--->| |_____| | | | | клавиатура *--------* *--------* master slave

*/

/* Опрос дескрипторов */ void wm_select(){ int nready; int nfds; int maxfd; int nopen; /* число опрашиваемых дескрипторов */ register f;

fd_set set, rset; /* маски */ struct timeval timeout, rtimeout;

FD_ZERO(&set); nopen = 0; /* очистка маски */

FD_SET (PP.pfd, &set); nopen++; /* учесть в маске */ FD_SET (STDIN, &set); nopen++; maxfd = max(PP.pfd, STDIN);

timeout.tv_sec = 3600; /* секунд */ timeout.tv_usec = 0; /* миллисекунд */ nfds = maxfd + 1; while( nopen ){ rset = set; rtimeout = timeout;

/* опросить дескрипторы */ if((nready = select( nfds, &rset, NULL, NULL, &rtimeout )) <= 0) continue;

for(f=0; f < nfds; f++ ) if( FD_ISSET(f, &rset)){ /* дескриптор f готов */ int n;

if((n = read(f, buf, sizeof buf)) <= 0 ){ FD_CLR(f, &set); nopen--; /* исключить */ close(f);

} else { int fdout;

/* учет и контроль */ if( f == PP.pfd ){ fdout = STDOUT; PP.out_bytes += n; if( fpscript ) fwrite(buf, 1, n, fpscript);

} else if( f == STDIN ) { fdout = PP.pfd; PP.in_bytes += n; if( halfflag && fpscript ) fwrite(buf, 1, n, fpscript); if( autoecho ) write(STDOUT, buf, n); } write(fdout, buf, n); } } } }

int main(ac, av) char **av; { while( ac > 1 && *av[1] == '-' ){ switch(av[1][1]){ case 's': scriptflg++; break; case 'f': av++; ac--; protocol = av[1]; scriptflg++; break; case 'h': halfflag++; break; case 'a': autoecho++; break; default: fprintf(stderr, "Bad key %s\n", av[1]); break; } ac--; av++; } if( scriptflg ){ fpscript = fopen( protocol, "w" ); } ac--; av++;

wm_init(); PP = wm_ptypair(); if( PP.pfd < 0 ){ fprintf(stderr, "Cannot get pty. Please wait and try again.\n"); return 1; } wm_fixtty(); wm_startshell(ac, av); go++; wm_select(); wm_done(0); /* NOTREACHED */ return 0; }

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




Содержание  Назад