аналог утилиты cat по отношению к терминалу (terminal io)
Ключевые слова: terminal, io, (найти похожие документы)
Date: Fri, 15 Mar 2002 18:10:26 +0300
From: Alexander Pevzner <pzz@pzz.msk.ru>
Newsgroups: fido7.ru.unix.prog
Subject: аналог утилиты cat по отношению к терминалу
ZK> А можено настроить cu (использует часть конфигов uucp) и его stdout
ZK> перенаправить в файл - тоже получится лог в файле.
Все эти cu выведут из равновесия кого угодно :-(
Вот, простенькая програмка (моего изготовления), которая ведет себя
как cat по отношению к терминалу.
MakeFile:
CC = gcc
CPPFLAGS = -Wall -O2 -g
LIBS =
LDFLAGS =
OBJS = \
catterm.o
PROG = catterm
ALL = $(PROG)
PREFIX = /usr/local
# Autodependencies
ifneq (.depend,$(wildcard .depend))
ALL = dep_then_all
endif
# Standard rules
all: $(ALL)
dep_then_all:
make dep
make all
clean:
rm -f .depend
rm -f *.o core $(TESTS)
rm -f *.so
rm $(PROG)
install: $(PROG)
cp $(PROG) $(PREFIX)/bin/$(PROG)
strip $(PREFIX)/bin/$(PROG)
atnBuffer: atnBuffer.o test-atnBuffer.o
$(CC) $(CPPFLAGS) -o $@ $+
$(PROG): $(OBJS)
$(CC) $(CPPFLAGS) -o $@ $+ $(LIBS) $(LDFLAGS)
# Autodependencies
dep:
$(CC) $(CPPFLAGS) -M *.c >.depend
ifeq (.depend,$(wildcard .depend))
include .depend
endif
catterm.c:
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
static speed_t tty_speed = B9600;
static char *tty_line = NULL;
#define panic_perror(msg...) \
do{ \
int err = errno; \
printf( msg ); \
printf( ": %s\n", strerror( err ) ); \
exit( 1 ); \
}while(0)
#define panic(msg...) \
do{ \
int err = errno; \
printf( msg ); \
printf( "\n" ); \
exit( 1 ); \
}while(0)
static void usage( void )
{
printf(
"usage:\n"
" catterm [options] line\n"
"options:\n"
" -s speed -- line speed (default is 9600)\n"
);
exit( 1 );
}
static speed_t speed2termio( unsigned long speed )
{
switch( speed )
{
case 2400: return B2400;
case 4800: return B4800;
case 9600: return B9600;
case 19200: return B19200;
case 38400: return B38400;
case 57600: return B57600;
case 115200: return B115200;
default: return 0;
}
}
static void parse_argv( int argc, char **argv )
{
int opt;
while( (opt = getopt( argc, argv, "s:" )) != EOF )
{
switch( opt )
{
case 's':
{
char *end;
unsigned long speed = strtoul( optarg, &end, 0 );
if( *end || !(tty_speed = speed2termio( speed )) )
{
printf( "%s: invalid speed -- %s\n", argv[0], optarg );
usage();
}
}
break;
default:
usage();
}
}
if( optind < argc )
tty_line = argv[ optind ];
else
usage();
}
static FILE *tty_open( void )
{
int fd;
struct termios mode;
speed_t speed = speed2termio( tty_speed );
int tmp;
FILE *fp;
fd = open( tty_line, O_RDWR | O_NONBLOCK | O_NOCTTY );
if( fd == -1 )
panic_perror( "open()" );
memset( &mode, 0, sizeof( mode ) );
mode.c_cflag = CS8 | HUPCL | CLOCAL;
mode.c_iflag = IGNBRK | IGNPAR;
mode.c_oflag = 0;
mode.c_lflag = 0;
cfsetospeed( &mode, speed );
cfsetispeed( &mode, speed );
mode.c_cc[ VMIN ] = 1;
mode.c_cc[ VTIME ] = 0;
if( tcsetattr( fd, TCSANOW, &mode ) == -1 )
panic_perror( "tcsetattr()" );
tmp = fcntl( fd, F_GETFD );
tmp &= ~O_NONBLOCK;
fcntl( fd, F_SETFL, tmp );
fp = fdopen( fd, "rw" );
if( !fp )
panic_perror( "fdopen()" );
return fp;
}
int main( int argc, char *argv[] )
{
FILE *fp;
int c;
parse_argv( argc, argv );
fp = tty_open();
while( (c = getc( fp )) != EOF )
putchar( c );
return 0;
}
--
Wishes, Alexander Pevzner (pzz@pzz.msk.ru)