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



         

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


Пример 25

/* Пример использования именованных "труб" (pipes) FIFO-файлов * для коммуникации независимых процессов * (FIFO - first in, first out : первым пришел - первым ушел). * По мотивам книги М.Дансмура и Г.Дейвиса. */

/* файл P_packet.h --------------------------------------------*/ #include <sys/types.h>

#include <sys/stat.h> /* S_IFIFO */

/* структура пакета-запроса */ struct packet { int pk_pid; /* идентификатор процесса-отправителя */ int pk_blk; /* номер блока, который надо прочитать */ int pk_code; /* код запроса */ };

/* request codes (коды запросов) */ #define RQ_READ 0 /* запрос на чтение */ #define CONNECT 1 /* запрос на соединение */ #define SENDPID 2 /* ответ на запрос соединения */ #define DISCONNECT 3 /* разрыв связи */ #define BYE 4 /* завершить сервер */

/* имена FIFO-каналов связи */ #define DNAME "datapipe" #define CNAME "ctrlpipe"

/* размер блока информации */ #define PBUFSIZE 512

/* P_client.c --------------------------------------------------------- */ /* * Процесс-клиент, посылающий запросы к серверу. */ #include <stdio.h>

#include <signal.h>

#include <fcntl.h>

#include "P_packet.h"

int datapipe, ctrlpipe; int got_sig; int mypid; /* идентификатор процесса-клиента */ int spid; /* идентификатор процесса-сервера */

/* waiting for signal */ #define WAITSIG while( !got_sig )

void handler(nsig){ signal( SIGUSR1, handler ); got_sig ++; }

void init(){ extern void die();

/* Ожидать создания каналов связи */ while( (datapipe = open( DNAME, O_RDONLY | O_NDELAY )) < 0 ); while( (ctrlpipe = open( CNAME, O_WRONLY | O_NDELAY )) < 0 ); mypid = getpid(); /* my process identifier */ printf( "Client pid=%d started\n", mypid );

signal( SIGINT, die); signal( SIGQUIT, die); signal( SIGTERM, die);

handler(0); }

int canRun = 1;

void die(nsig){ canRun = 0; }

/* подключиться к серверу, запросив его pid */ connect(){ struct packet pk;

pk.pk_pid = mypid; pk.pk_code = CONNECT; pk.pk_blk = (-1);




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