Dans l'exemple ci-dessous, le client se connecte sur un inter serveur standard (key=1000) et lui ordonne de remplir la matrice 1 qui est commune. A la fin de l'exécution, le client affiche une partie du contenu de la matrice partagée avant de libérer la ressource.
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include "ipcdef.h"
float *ptr; /* pointeur sur matrice partagee */
int semid; /* descripteur semaphore */
struct block_kw *block; /* pointeur sur bloc de communication */
extern int sem_key; /* identificateur de semaphore */
extern int block_key; /* identificateur de memoire pour bloc */
extern int matrix_key; /* identificateur de memoire pour matrice */
void
my_handler(sig)
int sig;
{
fprintf(stderr,"timeout\n");
}
main()
{
int i;
int timeout = 4;
int stat;
signal(SIGALRM, my_handler);
sem_key = 1001;
block_key = 1002;
if (init_sem_block(&semid, &block) < 0) {
printf("erreur allocation semaphore ou bloc");
exit();
}
matrix_key = 1000;
if (ask_and_init_shm(semid,block,&ptr,0,0) == -1) {
printf("erreur allocation matrice partagée");
exit();
}
dec_sem_zero(semid, block, timeout);
ini_shm_block_kw(block);
put_shm_block_kw(block, "COMMAND", "[1](:,:)=setv(1,nx*ny)");
block->ackno = 1;
setval_sem(semid, 2, 1);
inc_sem(semid, 1);
if ((stat = wait_for_sem(semid, 2, timeout)) == -2) {
if (kill(block->pid_server, 0) == 0) {
kill(block->pid_server, SIGINT);
if (getpid() == block->pid_client) {
if (get_cmd_sem(semid, 0, GETVAL) == 0)
inc_sem(semid, 0);
}
}
exit();
}
for(i=0;i<10;i++)printf("%f\n",*(ptr+i));
inc_sem(semid, 0);
}