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




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


sys_call(...); /* ждет события */ // если нас сбил сигнал, то по сигналу будет // еще вызвана реакция на него - onalarm

if(alarmed){ // событие так и не произошло. // вызов прерван сигналом т.к. истекло время. }else{ alarm(0); /* отменить заказ сигнала */ // событие произошло, сисвызов успел // завершиться до истечения времени. } signal (SIGALRM, oldaction);

Напишите программу, которая ожидает ввода с клавиатуры в течение 10 секунд. Если ничего не введено - печатает "Нет ввода", иначе - печатает "Спасибо". Для ввода можно использовать как вызов read, так и функцию gets (или getchar), поскольку функция эта все равно внутри себя издает системный вызов read. Исследуйте, какое значение возвращает fgets (gets) в случае прерывания ее системным вызовом.

/* Копирование стандартного ввода на стандартный вывод * с установленным тайм-аутом. * Это позволяет использовать программу для чтения из FIFO-файлов * и с клавиатуры. * Небольшая модификация позволяет использовать программу * для копирования "растущего" файла (т.е. такого, который в * настоящий момент еще продолжает записываться). * Замечание: * В ДЕМОС-2.2 сигнал НЕ сбивает чтение из FIFO-файла, * а получение сигнала откладывается до выхода из read() * по успешному чтению информации. Пользуйтесь open()-ом * с флагом O_NDELAY, чтобы получить требуемый эффект. * * Вызов: a.out /dev/tty * * По мотивам книги М.Дансмура и Г.Дейвиса. */

#define WAIT_TIME 5 /* ждать 5 секунд */ #define MAX_TRYS 5 /* максимум 5 попыток */ #define BSIZE 256 #define STDIN 0 /* дескриптор стандартного ввода */ #define STDOUT 1 /* дескриптор стандартного вывода */

#include <signal.h>

#include <errno.h>

#include <stdio.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

char buffer [ BSIZE ]; extern int errno; /* код ошибки */

void timeout(nsig){ signal( SIGALRM, timeout ); } void main(argc, argv) char **argv;{ int fd, n, trys = 0; struct stat stin, stout;




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