Мобильное программирование приложений реального времени в стандарте POSIX


         

Процесс читает строки из объекта


/* * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Процесс читает строки из объекта в разделяемой памяти */
/* и копирует их на стандартный вывод */
/* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include
#include
#include
#include
#include
#include
#include
#include "g_shm.h"
/* * * * * * * * * * * * * * * * * * * * */
/* Открытие разделяемого сегмента памяти,*/
/* чтение из сегмента и выдача строк */
/* на стандартный вывод */
/* * * * * * * * * * * * * * * * * * * * */
int main (void) {
int fd_shm; /* Дескриптор объекта */
/* в разделяемой памяти */
FILE *fp; /* Поток для чтения из объекта */
char line [LINE_MAX];/* Буфер для копируемых строк */
sigset_t smask; /* Маска ожидаемых сигналов */
siginfo_t sinfo; /* Структура для получения */
/* данных о сигнале */
pid_t ppid; /* Идентификатор родительского */
/* процесса */
/* Откроем разделяемый сегмент памяти */
if ((fd_shm = shm_open (O_SHM_NAME, O_RDONLY,
0777)) < 0) {
perror ("SHM_OPEN");
return (1);
}
/* Сформируем поток по файловому дескриптору объекта */
/* в разделяемой памяти */
assert ((fp = fdopen (fd_shm, "r")) != NULL);
/* Отменим буферизацию ввода */
setbuf (fp, NULL);
/* Запомним идентификатор родительского процесса */
ppid = getppid ();
/* Сформируем маску ожидаемых сигналов (SIG_SHM) */
(void) sigemptyset (&smask);
(void) sigaddset (&smask, SIG_SHM);
/* Подготовительная работа закончена */
while ((fseek (fp, 0, SEEK_SET) == 0) &&
/* Дождемся, когда из объекта можно будет читать */
(sigwaitinfo (&smask, &sinfo) == SIG_SHM) &&
/* И прочитаем строку, а не конец файла */
(sinfo.si_value.sival_int == SIGVAL_LINE)) {
(void) fgets (line, sizeof (line), fp);
/* Сообщим родительскому процессу, */
/* что данные из объекта извлечены */
assert (kill (ppid, SIG_SHM) == 0);
/* Выдадим, наконец, строку на стандартный вывод */
assert (fputs (line, stdout) != EOF);
}
fclose (fp);
return 0;
}

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