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



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


/* Описатель трассируемого процесса */ struct ptypair { char line[25]; /* терминальная линия: /dev/ttyp? */ int pfd; /* дескриптор master pty */ long in_bytes; /* прочтено байт с клавиатуры */ long out_bytes; /* послано байт на экран */ int pid; /* идентификатор процесса */ time_t t_start, t_stop; /* время запуска и окончания */ char *command; /* запущенная команда */ } PP;

/* Эта функция вызывается при окончании трассируемого процесса * по сигналу SIGCLD */ char Reason[128]; void ondeath(sig){ int pid; extern void wm_done(); int status; int fd;

/* выявить причину окончания процесса */ while((pid = wait(&status)) > 0 ){ if( WIFEXITED(status)) sprintf( Reason, "Pid %d died with retcode %d", pid, WEXITSTATUS(status)); else if( WIFSIGNALED(status)) { sprintf( Reason, "Pid %d killed by signal #%d", pid, WTERMSIG(status)); #ifdef WCOREDUMP if(WCOREDUMP(status)) strcat( Reason, " Core dumped" ); #endif } else if( WIFSTOPPED(status)) sprintf( Reason, "Pid %d suspended by signal #%d", pid, WSTOPSIG(status)); } wm_done(0); }

void wm_init(){ wm_checkttys();

GTTY(TTYFD, &told);

/* Сконструировать "сырой" режим для нашего _базового_ терминала */ tnew = told;

tnew.c_cc[VINTR] = '\0'; tnew.c_cc[VQUIT] = '\0'; tnew.c_cc[VERASE] = '\0'; tnew.c_cc[VKILL] = '\0'; #ifdef VSUSP tnew.c_cc[VSUSP] = '\0'; #endif

/* CBREAK */ tnew.c_cc[VMIN] = 1; tnew.c_cc[VTIME] = 0;

tnew.c_cflag &= ~(PARENB|CSIZE); tnew.c_cflag |= CS8; tnew.c_iflag &= ~(ISTRIP|ICRNL); tnew.c_lflag &= ~(ICANON|ECHO|ECHOK|ECHOE|XCASE);

tnew.c_oflag &= ~OLCUC; /* но оставить c_oflag ONLCR и TAB3, если они были */

/* моды для псевдотерминала */ ttypmodes = told; /* не выполнять преобразования на выводе: * ONLCR: \n --> \r\n * TAB3: \t --> пробелы */ ttypmodes.c_oflag &= ~(ONLCR|TAB3);

(void) signal(SIGCLD, ondeath); }

void wm_fixtty(){ STTY(TTYFD, &tnew); } void wm_resettty(){ STTY(TTYFD, &told); }

/* Подобрать свободный псевдотерминал для трассируемого процесса */ struct ptypair wm_ptypair(){ struct ptypair p;




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