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


              

прочитать ответ из канала данных


got_sig = 0; write( ctrlpipe, &pk, sizeof pk ); /* послать запрос */
/* ожидать сигнала-"толчка" */ WAITSIG;
/* прочитать ответ из канала данных */ read( datapipe, &pk, sizeof pk );
/* послать сигнал-подтверждение */ kill( pk.pk_pid, SIGUSR1 ); return pk.pk_pid; }
void disconnect(){ struct packet pk;
pk.pk_pid = mypid; pk.pk_code = DISCONNECT; pk.pk_blk = (-1);
got_sig = 0; write( ctrlpipe, &pk, sizeof pk ); /* send request */
/* wait for reply */ WAITSIG;
/* receive reply */ read( datapipe, &pk, sizeof pk );
/* confirm */ kill( pk.pk_pid, SIGUSR1 );
printf( "Disconnected.\n" ); }
request( ptr, blk, spid ) char *ptr; int blk; int spid; { struct packet pk;
pk.pk_pid = mypid; pk.pk_blk = blk; pk.pk_code = RQ_READ;
got_sig = 0; write( ctrlpipe, &pk, sizeof pk ); WAITSIG; read( datapipe, ptr, PBUFSIZE ); kill( spid, SIGUSR1 ); }
bye(){ struct packet pk;
pk.pk_pid = mypid; pk.pk_code = BYE; pk.pk_blk = (-1);
got_sig = 0; write( ctrlpipe, &pk, sizeof pk ); /* send request */ exit(0); }
/* client [номер_блока] */ main(argc, argv) char *argv[]; { int blk; char buffer[ PBUFSIZE ];
setbuf( stdout, NULL ); /* make unbuffered */ blk = (argv[1] ? atoi( argv[1] ) : 0); init(); spid = connect(); printf( "Client pid=%d connected to server pid=%d\n", mypid, spid );
/* запрос блока номер -33 соответствует запросу "завершить * работу сервера" */ if( blk == -33 ) bye();
/* в цикле посылать запросы на чтение блока blk */ while( canRun ){ request( buffer, blk, spid ); printf( "\nBEG-------------------------------------\n" ); fwrite( buffer, PBUFSIZE, 1, stdout ); printf( "\nEND-------------------------------------\n" ); } disconnect(); /* отключиться от сервера */ exit(0); }
/* P_server.c ---------------------------------------------------------*/ /* * Процесс-сервер, принимающий запросы и выполняющий их. */
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>

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