䳿 || , , . : (|| , ) .
SERVER CLIENT
Hello,World
|| || :
1. ;
2. , .
|| , . |',| . ,| '|'| || (, ). - || , . || 0 1, .
|| ||, :
- , Server Client;
- Server ', , ';
- Client ', , , || ', , , || ', || .
|| :
int semget (key_ tKey, int nsems, int semflag); - ID.
:
- Key - ||, , || ;
- nsems - ;
- semflag - ( shmget()).
ϳ , , || , :
- ;
- .
:
semop (int semid, struct sembuf *semop, size_t nops);
:
- semid - ;
- nops - , | , , | 䳿 , || ;
- struct sembuf *semop - , semop, .
|| :
-
г 0 -
|| - , , || 0
:
- || || ;
- || ;
|
|
- , || .
|| || :
1. ;
2. || , .
||:
||, ( "0" "1"), , "0" - , "1" - .
:
Static struct sembuf sop_ lock[]={0,0,0},{0,1,0}
, :
Semop (semid,&sop_lock[0],2).
:
Static struct sembuf sop_ unlock[]={0-1,0};
:
Semop (semid,&sop_unlock[0],1);
||:
"0" - ; "1" - ( ).
:
Static struct sembuf sop_ lock[1]={0-1,0}
Semop (semid,&sop_lock[0],1);
Static struct sembuf sop_unlock[1]={0,1,0};
Semop (semid,&sop_unlock[0],1);
Server.c
int main()
{
printf("Server start\n");
Message *msgptr;
key_t key;
int shmid, semid;
key=ftok("server",1);
shmid=shmget(key,sizeof(Message),PERM | IPC_CREAT);
msgptr = (Message*)shmat(shmid,0,0);
semid = semget(key,2,PERM | IPC_CREAT);
semop(semid,&proc_wait[0],1);
semop(semid,&mem_lock[0],2);
printf("Client send message: %s",msgptr->buff);
semop(semid,&mem_unlock[0],1);
shmdt(msgptr);
printf("Server exit\n");
exit(0);
}
Client.c
int main()
{
printf("Client start\n");
Message *msgptr;
key_t key;
int shmid,semid;
key=ftok("server",1);
shmid=shmget(key,sizeof(Message),0);
msgptr=(Message*)shmat(shmid,0,0);
semid=semget(key,2,PERM);
semop(semid,&mem_lock[0],2);
semop(semid,&proc_start[0],1);
sprintf(msgptr->buff,"Hello world!\n");
printf("Client send message 'Hello world'\n");
semop(semid,&mem_unlock[0],1);
semop(semid,&mem_lock[0],2);
shmdt(msgptr);
shmctl(shmid,IPC_RMID,0);
semctl(semid,0,IPC_RMID);
printf("Client exit\n");
exit(0);
}
Shmem.h
#define MAXBUFF 80
#define PERM 0666
typedef struct mem_msg
{
int segment;
char buff[MAXBUFF];
}Message;
struct sembuf proc_wait[1]={1,-1,0};
struct sembuf proc_start[1]={1,1,0};
struct sembuf mem_lock[2]={0,0,0,0,1,0};
struct sembuf mem_unlock[1]={0,-1,0};