Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №41 / lab4
.txtCLIENT.C ==>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include "shmem.h"
main()
{
Message *msgptr;
key_t key;
int shmid, semid;
if((key=ftok("server",'A'))<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);}
sprintf(msgptr->buff,"hallo\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);
}
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);}
SERVER.C ==>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include "shmem.h"
int main()
{
Message *msgptr;
key_t key;
int shmid, semid;
if((key=ftok("server",'A'))<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);}
if(semop(semid, &proc_wait[0],1)<0){
printf("error executig operation\n");
exit(1);}
if(semop(semid,&mem_lock[0],2)<0){
printf("error exe operation\n");
exit(1);}
printf("%s",msgptr->buff);
if(semop(semid,&mem_unlock[0],1)<0){
printf("eror exe operation\n");
exit(1);}
if (shmdt(msgptr)<0){
printf("error disconnecting\n");
exit(1);}
exit(0);}
SHMEM.H
#define MAXBUFF 80
#define PERM 0666
typedef struct mem_msg{
int segment;
char buff[MAXBUFF];
}Message;
static struct sembuf proc_wait[1]={1,-1,0};
static struct sembuf proc_start[1]={1,1,0};
static struct sembuf mem_lock[2]={0,0,0,
0,1,0};
static struct sembuf mem_unlock[1]={0,-1,0};
#Makefile
all: server client
server: server.c
gcc server.c -o server
client: client.c
gcc client.c -o client
clean: -rm -f server client