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




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


Пример 15

/* Команда для изменения скорости обмена в линии (baud).*/ /* Пример вызова в XENIX: baud /dev/tty1a 9600 */ /* /dev/tty1a - это коммуникационный последов. порт #1 */ /* Про управление модами терминала смотри man termio */ #include <fcntl.h>

#include <termio.h>

struct termio old, new; int fd = 2; /* stderr */ struct baudrate{ int speed; char *name;} br[] = { { B0, "HANGUP" }, { B1200, "1200" }, { B9600, "9600" }, { B600, "600" }, { B2400, "2400" }, { EXTA, "19200" }, }; #define RATES (sizeof br/sizeof br[0])

main(ac, av) char *av[]; { register i; char *newbaud; if( ac == 3 ){ if((fd = open(av[1], O_RDWR)) < 0 ){ printf("Не могу открыть %s\n", av[1]); exit(1); } newbaud = av[2]; } else newbaud = av[1]; if( ioctl(fd, TCGETA, &old) < 0 ){ printf("Попытка управлять не терминалом и не портом.\n"); exit(2); } if(newbaud == (char*)0) newbaud = "<не задано>"; new=old; for(i=0; i < RATES; i++) if((old.c_cflag & CBAUD) == br[i].speed) goto ok; printf("Неизвестная скорость\n"); exit(3);

ok: printf("Было %s бод\n", br[i].name); for(i=0; i < RATES; i++) if( !strcmp(newbaud, br[i].name)){ new.c_cflag &= ~CBAUD; /* побитное "или" всех масок B... */ new.c_cflag |= br[i].speed; if( ioctl(fd, TCSETA, &new) < 0) perror("ioctl"); /* Скорость обмена может не измениться, если терминал * не открыт ни одним процессом (драйвер не инициализирован). */ exit(0); } printf("Неверная скорость %s\n", newbaud); exit(4); }

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

| |




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