Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Пример 5. Использование сигналов.

#include <signal.h>

main()

{

extern cher();

signal(SIGINT,сher); /*при получении сигнала прерывания вызывать функцию catcher */

kill(0,SIGINT); /*послать всем процессам сигнал прерывание*/

}

cher()

{

}

Пример 6. Сообщения.

Процесс вызывает функцию msgget для того, чтобы получить дескриптор для записи с идентификатором MSGKEY. Длина сообщения принимается равной 256 байт, хотя используется только первое поле целого типа, в область текста сообщения копируется идентификатор процесса, типу сообщения присваивается значение 1, после чего вызывается функция msgsnd для посылки сообщения.

Пользовательский процесс

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#define KEY 75

struct msgform {

long mtype;

char mtext[256];

};

main()

{

struct msgform msg;

int msgid,pid,*pint;

msgid = msgget(KEY,0777);

pid = getpid();

pint = (int *) msg.mtext;

*pint = pid; /* копирование идентификатора

* процесса в область текста

* сообщения */

msg.mtype = 1;

msgsnd(msgid,&msg,sizeof(int),0);

msgrcv(msgid,&msg,256,pid,0); /* идентификатор

* процесса используется в

* качестве типа сообщения */

printf("клиент: получил от процесса с pid %d\n",

*pint);

}

Пример 7. Сообщения.

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

Обслуживающий процесс создает сообщение путем установки флага IPC _CREAT при выполнении функции msgget и получает все сообщения (типа 1) - запросы от процессов-клиентов. Он читает текст сообщения, находит идентификатор процесса-клиента и приравнивает возвращаемое значение типа сообщения значению этого идентификатора. В данном примере обслуживающий процесс возвращает в тексте сообщения процессу-клиенту его идентификатор, и клиент получает сообщения с типом, равным идентификатору клиента. Таким образом, обслуживающий процесс получает сообщения только от клиентов, а клиент - только от обслуживающего процесса. Работа процессов реализуется в виде многоканального взаимодействия, строящегося на основе одной очереди сообщений.

master.c //

Родительский процесс

main()

{

int i;

if(fork()==0)

execl(“server.out”,“server.out”,0);

if(fork()==0)

execl(“client.out”,“client.out”,0);

wait((int*)0);

}

client.c //Клиент

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

#define KEY 75

struct msgbuf msg;

//struct msgbuf // Можно не описывать

// { // так как определена в sys/msg.h

// long mtype;

// char mtext[];

// }msg;

int msgid;

main()

{

int tt=49,i;

msgid=msgget(KEY,0777);

for(i=1;i<10;);

{

tt++;

strcpy(msg.mtext,”Привет серверу “);

msg.mtext[15]=(char)tt;

msg.mtype=1;

msgsnd(msgid,&msg,256,0);sleep(3);

strcpy(msg.mtext,”“);

if(msgrcv(msgid,&msg,256,2,0)>0)

{

printf(“Клиент: получил сообщение от сервера %s\n”,msg.mtext);

sleep(3);

i++;

}

}

}

server.c // Обслуживающий процесс (сервер)

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

#define KEY 75

struct msgbuf msg;

int msgid;

main()

{

int tt=49,i;

msgid=msgget(KEY,0777|IPC_CREAT);

for(i=1;i<10;);

{

strcpy(msg.mtext,”“);

if(msgrcv(msgid,&msg,256,1,0)>0)

{

printf(“Сервер: получил сообщение от клиента %s\n”,msg.mtext);

sleep(3);

i++;

}

tt++;

strcpy(msg.mtext,”Привет клиенту “);

msg.mtext[16]=(char)tt;

msg.mtype=2;

msgsnd(msgid,&msg,256,0);

}

msgctl(msgid,IPC_RMID,0);

}