Программирование в стандарте POSIX


Приостановка выполнения на заданное время - часть 3


(void) strftime (dtbuf, sizeof (dtbuf), "%c", localtime (&lt_mod)); fprintf (stderr, "%s %ld\n", dtbuf, st_buf.st_size); }

int main (int argc, char *argv []) { int res;

if (argc != 2) { fprintf (stderr, "Использование: %s файл\n", argv [0]); return (1); }

proc_init (argv [1]); while (1) { if ((res = check_mod (argv [1])) > 0) { proc_mod (); } else if (res < 0) { return (res); } sleep (1); }

return 0; }

Листинг 12.29. Пример программы, использующей функцию sleep().

Возможные результаты работы этой программы показаны в листинге 12.30.

Данные о размере файла /var/log/cron Время изменения Размер Tue Jan 6 12:50:00 2004 11191 Tue Jan 6 13:01:00 2004 11263 Tue Jan 6 13:10:00 2004 11409 Tue Jan 6 13:20:00 2004 11481 . . . Tue Jan 6 13:40:00 2004 11624 . . .

Листинг 12.30. Возможные результаты работы программы, использующей функцию sleep().

Функция nanosleep() позволяет до некоторой степени промоделировать работу функций poll() и select(), реализующих пассивное ожидание готовности данных, в тех ситуациях, когда данные поступают из разнородных источников, которые poll() и select() не обслуживают (не только из файлов, но и из очередей сообщений, как результат опроса значений семафоров и т.п.). В листинге 12.31 показан цикл "полуактивного" (с короткими приостановками) ожидания поступления данных из канала и обнуления значения семафора.

#define N ... #define MY_BUFSIZ ...

struct timespec tmsp = {0, 20000000}; int fds [2]; /* Файловые дескрипторы канала */ int semid; /* Идентификатор набора семафоров */ struct sembuf sembuf [1]; /* Массив для задания операций над семафором */ char buf [MY_BUFSIZ]; /* Буфер для чтения данных из канала */ int brd; /* Число прочитанных байт */ int i;

. . .

fcntl (fds [0], F_SETFL, O_NONBLOCK); sembuf [0].sem_num = 0; sembuf [0].sem_flg = IPC_NOWAIT; sembuf [0].sem_op = 0;

for (i = 0; i < N; i++) { nanosleep (&tmsp, NULL);

if ((brd = read (fds [0], buf, MY_BUFSIZ) > 0) { /* Обработка прочитанных данных. */ /* Возможно, поступление данных на этом не закончилось */ . . .continue; }

if (semop (semid, sembuf, 1) == 0) { /* Значение семафора обнулено, ждать больше нечего */ . . . if (brd <= 0) { close (fds [0]); break; } } }

. . .

Листинг 12.31. Пример реализации полуактивного ожидания наступления нескольких событий с помощью функции nanosleep().

Подобные действия характерны для функций аккуратного завершения многопроцессных приложений, когда значение семафора играет роль счетчика активных порожденных процессов, от которых через канал поступают данные.




Начало  Назад  Вперед



Книжный магазин