Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
7.32 Mб
Скачать

Текст программы:

Файл client.c

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/shm.h>

#include "shmem.h"

void close_pipe( int id ) {

}//close_pipe

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

Message *msgptr;

key_t key;

int shmid, semid;

char *string = argv[1];

printf(">>>> %s\n", string );

//получаем ключ. Для разделяемой памяти и для семафора

if((key=ftok("server",'F'))<0){

printf("Error(key)\n");

exit(1);

}

//Получаем доступ к разделяемой памяти

if((shmid=shmget(key,sizeof(Message),0))<0){

printf("Error\n");

exit(1);

}

//присоединяем область резделяемой памяти

if((msgptr=(Message *) shmat(shmid,0,0))<0){

printf("Error\n");

exit(1);

}

//получаем доступ к семафору

if((semid=semget(key,2,PERM))<0){

printf("Error\n");

exit(1);

}

//блокируем разделяемую память(семафор)

if(semop(semid,&mem_lock[0],2)<0){

printf("Error(operation)\n");

exit(1);

}

//посылаем уведомление серверу

if(semop(semid,&proc_start[0],1)<0){

printf("Error(Operation)\n");

exit(1);

}

//записываем в разделяемую память сообщение

//printf("!!!!client-1\n");

sprintf(msgptr->buff, string );

//освободим разделяемую память(семафор)

//printf("!!!!client-2\n");

if(semop(semid,&mem_unlock[0],1)<0){

printf("Error(Operation\n");

exit(1);

}

//ждем пока сервер не освободит разделяемую память

if(semop(semid,&mem_lock[0],2)<0){

printf("Error(Operation)\n");

exit(1);

}

//отключаемся от области

if(shmdt(msgptr)<0){

printf("Error(Disconnect)\n");

exit(1);

}

//printf("!!!!client-3\n");

//удаляем созданные объекты

/*

if(shmctl(shmid,IPC_RMID,0)<0){

printf("Error(Deleting)\n");

exit(1);

}

if(semctl(semid,0,IPC_RMID)<0){

printf("Error(Delete in Semafor)\n");

exit(1);

}

*/

//close_pipe( shmid );

if(semop(semid,&mem_unlock[0],1)<0){

printf("Error(Operation\n");

exit(1);

}

//printf("!!!!client-4\n");

exit(0);

}

Файл Server.c

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/shm.h>

#include <unistd.h>

#include "shmem.h"

int main() {

Message *msgptr;

key_t key;

int shmid, semid;

char simbol;

//получаем ключ. Для разделяемой памяти и для семафора

if((key=ftok("server",'F'))<0){

printf("error(key)\n");

exit(1);

}

//Создаем область разделяемой разделяемой памяти

if((shmid=shmget(key,sizeof(Message),PERM|IPC_CREAT))<0){

printf("error\n");

exit(1);

}

//присоединяем область резделяемой памяти

if((msgptr=(Message *)shmat(shmid,0,0))<0){

printf("error(connecting)\n");

exit(1);

}

//получаем группу из двух семафоров

if((semid=semget(key,2,PERM|IPC_CREAT))<0){

printf("Error making semafor\n");

exit(1);

}

while (simbol != 'q') {

printf("Wait message from client\n");

//Ждем. Клиент начинает работу.

//Он блокирует разделяемую память. Затем,помещает сообщение в разделяемую память.

//Посылает сообщение( сообщает ) серверу. Разблокирует разделяемую память.

//printf("!!!!server-1\n");

if(semop(semid, &proc_wait[0],1)<0){

printf("error executig operation\n");

exit(1);

}

//printf("!!!!server-2\n");

//Блокируем разделяемую память

if(semop(semid,&mem_lock[0],2)<0){

printf("error exe operation\n");

exit(1);

}

//printf("!!!!server-3\n");

//Выводим сообщение из разделяемой памяти

printf("\n");

printf("%s",msgptr->buff);

printf("\n");

//printf("!!!!server-4\n");

//Разблокируем разделяемую память( освободим ее).

if(semop(semid,&mem_unlock[0],1)<0){

printf("eror exe operation\n");

exit(1);

}

//printf("!!!!server-5\n");

printf("\n-press to \"q\" for exit\n-press to \"enter\" to continue :");

simbol = getchar();

}//while

//Отключимся от области

if (shmdt(msgptr)<0){

printf("error disconnecting\n");

exit(1);

}

//printf("!!!!server-6\n");

//printf("!!!!server-7\n");

if(shmctl(shmid,IPC_RMID,0)<0){

printf("Error(Deleting)\n");

exit(1);

}

if(semctl(semid,0,IPC_RMID)<0){

printf("Error(Delete in Semafor)\n");

exit(1);

}

exit(0);

}//main

Соседние файлы в папке Лабораторная работа №4