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



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


fclose ( fplog ); }

void wm_done(sig){ char *getlogin(), *getenv(), *logname = getlogin(); time( &PP.t_stop ); /* запомнить время окончания */

wm_resettty(); /* восстановить режим базового терминала */ if( fpscript ) fclose(fpscript); if( PP.pid > 0 ) kill( SIGHUP, PP.pid ); /* "обрыв связи" */

if( go ) write_stat( PP.in_bytes, PP.out_bytes, PP.t_stop - PP.t_start, logname ? logname : getenv("LOGNAME"), PP.line, ctime(&PP.t_stop) ); printf( "\n" ); exit(0); }

/* Запуск трассируемого процесса на псевдотерминале */ void wm_startshell (ac, av) char **av; { int child, fd, sig;

if( ac == 0 ){ static char *avshell[] = { "/bin/sh", "-i", NULL }; av = avshell; } if((child = fork()) < 0 ){ perror("fork"); wm_done(errno); } if( child == 0 ){ /* SON */ if( tty_stdin ) setpgrp(); /* отказ от управляющего терминала */

/* получить новый управляющий терминал */ if((fd = open( PP.line, O_RDWR )) < 0 ){ exit(errno); }

/* закрыть лишние каналы */ if( fpscript ) fclose(fpscript); close( PP.pfd );

#ifdef __SVR4 /* Push pty compatibility modules onto stream */ ioctl(fd, I_PUSH, "ptem"); /* pseudo tty module */ ioctl(fd, I_PUSH, "ldterm"); /* line discipline module */ ioctl(fd, I_PUSH, "ttcompat"); /* BSD ioctls module */ #endif

/* перенаправить каналы, связанные с терминалом */ if( fd != STDIN && tty_stdin ) dup2(fd, STDIN); if( fd != STDOUT && tty_stdout ) dup2(fd, STDOUT); if( fd != STDERR && tty_stderr ) dup2(fd, STDERR); if( fd > STDERR ) (void) close(fd);

/* установить моды терминала */ STTY(TTYFD, &ttypmodes);

/* восстановить реакции на сигналы */ for(sig=1; sig < NSIG; sig++) signal( sig, SIG_DFL );

execvp(av[0], av); system( "echo OBLOM > HELP.ME"); perror("execl"); exit(errno); } else { /* FATHER */ PP.pid = child; PP.command = av[0]; time( &PP.t_start ); PP.t_stop = PP.t_start;

signal( SIGHUP, wm_done ); signal( SIGINT, wm_done ); signal( SIGQUIT, wm_done ); signal( SIGTERM, wm_done ); signal( SIGILL, wm_done ); signal( SIGBUS, wm_done ); signal( SIGSEGV, wm_done ); } }




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