Скачиваний:
15
Добавлен:
01.05.2014
Размер:
1.83 Кб
Скачать
#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);
}
Соседние файлы в папке Лабораторная работа №4