Dernière mise à jour sur le site le 21 avril 2020 - Téléchargement
SOURCES = sema1.c sema2.c sema3.c
EXECUTABLES = $(patsubst %.c, %, ${SOURCES} )
all : ${EXECUTABLES}
listsources :
/bin/ls -l ${SOURCES}
listexec :
@for mfile in ${EXECUTABLES} ; do \
if [ -f $$mfile ] ; then \
/bin/ls -l $$mfile; \
fi \
done
clean :
@/bin/rm -f ${EXECUTABLES}
/*
* ######
* ## sema1.c
* ## ~~~~~~~
* ## 04.02.1995: Creation TL
* ## 07.05.2018:
* ######
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
/* Declaration des Types et des Variables */
typedef void (*sighandler_t) (int);
extern int errno;
key_t key = 3;
int semid, nsems, semnum;
struct sembuf sops;
union semun {
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
} arg;
/* Routine de Traitement de l'interruption SIGINT */
/* -> on arrete le programme */
void my_stop_int()
{
printf( "\nsema1> my_stop_int : Arret du programme sans destuction du semaphore\n" );
exit( 0 );
}
/* Routine de Traitement de l'interruption SIGUSR1 */
/* -> on remet a zero la valeur du semaphore */
void my_stop_usr1()
{
int kr;
semnum = 0;
arg.val = 0;
kr = semctl( semid, semnum, SETVAL, arg );
if ( kr == 1 ) {
perror( "\nsema1> my_stop_usr1 : Pb. initialisation SEMAPHORE\n" );
} else {
printf( "\nsema1> my_stop_usr1 : Remise a Zero SEMAPHORE( 3, 0 )\n" );
}
}
/* Routine de Traitement de l'interruption SIGUSR2 */
/* -> on supprime le semaphore et arrete le programme */
void my_stop_usr2()
{
int kr;
semnum = 0;
kr = semctl(semid, semnum, IPC_RMID, NULL);
if ( kr == -1 ) {
perror( "\nsema1> my_stop_usr2 : Pb. destruction semaphore\n" ); exit( 2 );
} else {
printf( "\nsema1> my_stop_usr2 : Destruction SEMAPHORE(3)\n" );
}
exit( 0 );
}
/* Programme principal */
int main()
{
int kr, val;
char SS[ 1024 ];
char * Ptr_SS = &SS[ 0 ];
/* Prise en compte des routines de traitement des interruptions SIGINT, SIGUSR1 et SIGUSR2 */
/* tester sans SIGINT puis avec...*/
/*
signal( SIGINT , (sighandler_t) my_stop_int );
*/
signal( SIGUSR1, (sighandler_t) my_stop_usr1 );
signal( SIGUSR2, (sighandler_t) my_stop_usr2 );
/* Creation/attachement du groupe 3 constitue de 1 semaphore (numero zero) */
printf( " sema1> Ouverture Ensemble de Semaphores ( key = 3 ) avec 1 seul semaphore\n");
printf( " sema1> \n");
key = 3;
nsems = 1;
semid = semget( key, nsems, 0640 | IPC_CREAT );
if ( semid == -1 ) {
perror( " sema1> Creation SEMAPHORE impossible" ); exit( 1 );
}
/* Affichage de la valeur associiee au semaphore zero */
semnum = 0;
val = semctl( semid, semnum, GETVAL, NULL );
if ( val == -1 ) {
perror( " sema1> Pb. recuperation valeur semaphore zero" );
}
printf( " sema1> Valeur du semaphore zero = %d\n", val );
printf( " sema1> \n");
/* Message d'accueil */
printf( " sema1> Pour deverouiller la ressource, lancer sema2\n");
printf( " sema1> Pour remettre a Zero le SEMAPHORE(3), faire kill -%d %d\n"
, SIGUSR1, getpid() );
printf( " sema1> Pour arreter le programme, faire ^C ou bien kill -%d %d\n"
, SIGUSR2, getpid() );
/* precaution deverouillage automatique semop */
sops.sem_flg = SEM_UNDO;
/* boucle */
for (;;) {
printf( " sema1> Entrez un commentaire ----> " ); scanf( "%s", Ptr_SS );
sops.sem_num = 0;
sops.sem_op = -1; /* < 0 : demande d'un droit */
kr = semop( semid, &sops, 1 );
if ( kr == -1 ) {
if ( errno == 4 ) {
printf( " sema1> Deblocage par signal\n" );
} else {
printf( " sema1> Erreur decrementation semaphore\n" );
}
}
printf( " sema1> Liberation\n" );
printf( " sema1> Echo du commentaire - - > %s\n", Ptr_SS );
semnum = 0;
val = semctl( semid, semnum, GETVAL, NULL );
if ( val == -1 ) {
perror( " sema1> Pb. recuperation valeur semaphore" );
}
printf( " sema1> Valeur du semaphore = %d\n", val );
}
}
/* --- fin sema1.c --- */
Dernière mise à jour sur le site le 16 décembre 2019 - Téléchargement
/*
* ######
* ## sema2.c
* ## ~~~~~~~
* ## 04.02.1995: Creation TL
* ## 07.05.2018:
* ######
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
int main()
{
int semid, val, nsems, semnum, status;
key_t key;
struct sembuf sops;
size_t nsops;
/* recuperation du groupe 3 constitue de 1 semaphore */
key = 3;
nsems = 1;
semid = semget(key, nsems, 0640 | IPC_CREAT);
if ( semid == -1 ) {
perror( " sema2> Pb. recuperation SEMAPHORE\n" ); exit( 1 );
}
nsops=( size_t ) nsems;
sops.sem_num = 0;
sops.sem_op = 1; /* > 0 : donne un droit supplementaire*/
sops.sem_flg = 0;
status = semop( semid, &sops, nsops );
if ( status == -1 ) {
perror( " sema2> Pb. incrementation SEMAPHORE\n" ); exit(2);
}
semnum=0;
val = semctl(semid, semnum, GETVAL, NULL);
if ( val == -1 ) {
perror( " sema2> Pb. recuperation valeur SEMAPHORE\n" );
}
printf( " sema2> Valeur du SEMAPHORE(3, 0) = %d\n", val );
exit( 0 );
}
/* --- fin sema2.c --- */
Dernière mise à jour sur le site le 16 décembre 2019 - Téléchargement
/*
* ######
* ## sema3.c
* ## ~~~~~~~
* ## 12.02.2013: Creation T
* ## 07.05.2018:
* ######
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
/* Declaration des Types et des Variables */
extern int errno;
/* Programme principal */
int main()
{
key_t key = 3;
int semid, nsems, semnum;
int kr, val;
int b_EXISTS = 0;
/* Attachement Ensemble( 3 ) qui est constitue de 1 semaphore */
printf( " sema3> \n");
printf( " sema3> Tentative Ouverture Ensemble SEMAPHORES( 3 ) avec IPC_EXCL\n");
printf( " sema3> \n");
nsems = 1;
semid = semget( key, nsems, 0640 | IPC_CREAT | IPC_EXCL );
if ( semid == -1 ) {
if ( errno == EEXIST ) {
b_EXISTS = 1;
printf( " sema3> Ensemble de SEMAPHORES( 3 ) existant \n");
printf( " sema3> \n");
/* Re-ouverture sans IPC_EXCL */
semid = semget( key, nsems, 0640 | IPC_CREAT );
/* Affichage de la valeur associee au semaphore numero 0 */
semnum = 0;
val = semctl( semid, semnum, GETVAL, NULL );
if ( val == -1 ) {
perror( " sema3> Pb. recuperation valeur semaphore" );
} else {
printf( " sema3> Valeur du semaphore zero = %d\n", val );
}
printf( " sema3> \n");
} else {
perror( " sema3> Pb. Ouverture Ensemble SEMAPHORES( 3 )" ); exit( 1 );
printf( " sema3> \n");
}
} else {
printf( " sema3> Ensemble SEMAPHORES( 3 ) inexistant\n" );
printf( " sema3> \n");
}
/* Destruction de l'ensemble de semaphores ( 3 ) */
semnum = 0;
kr = semctl(semid, semnum, IPC_RMID, NULL);
if ( kr == -1 ) {
perror( " sema3> Pb. destruction semaphore\n" ); exit( 2 );
printf( " sema3> \n");
} else if ( b_EXISTS ) {
/* Affichage du message seulment si il existait avant */
printf( " sema3> Destruction SEMAPHORE(3)\n" );
printf( " sema3> \n");
}
}
/* --- fin sema3.c --- */