Ajout de fichiers
parent
1f0a8d59f7
commit
667f0aef08
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* RSc
|
||||
* essaicurses.c :
|
||||
* Illustration de l'utilisation de curses pour creer deux fenetres
|
||||
* avec un cadre.
|
||||
*/
|
||||
|
||||
#include <curses.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
*
|
||||
* creation_fenetre() : cree une fenetre de dialogue avec un cadre
|
||||
* sur n lignes debutant a la ligne d et comportant
|
||||
* le texte t centre sur le bord superieur du cadre
|
||||
* La fenetre occupe toutes les colonnes disponibles (COLS)
|
||||
* ENTREE:
|
||||
* n: nombre de lignes du cadre
|
||||
* d: ligne debut du cadre
|
||||
* t: texte affiche dans le haut du cadre
|
||||
* RESULTAT:
|
||||
* un pointeur sur la fenetre de dialogue creee
|
||||
*
|
||||
* REMARQUES:
|
||||
* - Afin de dessiner un cadre, une fenetre speciale (cadre)
|
||||
* est creee et la fonction box() est appelee pour cette fenetre.
|
||||
* - La fenetre de dialogue (w) est creee a l'interieur du cadre.
|
||||
* - La fonction newwin() admet 4 parametres :
|
||||
* - le nombre de lignes et le nombre de colonnes
|
||||
* - la ligne debut et la colonne debut
|
||||
*-------------------------------------------------------------------*/
|
||||
|
||||
WINDOW *creation_fenetre(int n,int d,char *t)
|
||||
{
|
||||
WINDOW *cadre ; /* la fenetre pour le cadre */
|
||||
WINDOW *w ; /* la fenetre de dialogue */
|
||||
|
||||
/* creation du cadre */
|
||||
|
||||
cadre= newwin(n,COLS,d,0) ;
|
||||
box(cadre,0,0) ;
|
||||
mvwprintw(cadre,0,COLS/2-strlen(t)/2,t) ;
|
||||
wrefresh(cadre) ;
|
||||
|
||||
/* creation de la fenetre de dialogue */
|
||||
|
||||
w= newwin(n-2,COLS-2,d+1,1) ;
|
||||
idlok(w,TRUE) ;
|
||||
scrollok(w,TRUE) ; /* mise en place du defilement (scrolling) */
|
||||
wclear(w) ;
|
||||
wrefresh(w) ;
|
||||
return w ;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
main()
|
||||
{
|
||||
const char CTRL_D = 4 ;
|
||||
|
||||
WINDOW *f_haut, *f_bas ; /* les 2 fenetres de dialogue */
|
||||
WINDOW *w ;
|
||||
char c ;
|
||||
int i ;
|
||||
|
||||
initscr() ; /* initialisation (obligatoire) de curses */
|
||||
noecho() ; /* suppression de l'echo des caracteres tapes*/
|
||||
cbreak() ; /* lecture non bufferisee */
|
||||
|
||||
/* creation des cadres et des fenetres de dialogue */
|
||||
|
||||
f_haut= creation_fenetre(LINES/2,0,"EMISSION") ;
|
||||
f_bas = creation_fenetre(LINES/2,LINES/2,"RECEPTION") ;
|
||||
|
||||
/* lecture et affichage des caracteres */
|
||||
|
||||
while (( c= wgetch(f_bas)) != CTRL_D)
|
||||
{
|
||||
w= islower(c) ? f_haut : f_bas; /* minuscules -> haut; autres -> bas */
|
||||
waddch(w,c) ;
|
||||
wrefresh(w) ;
|
||||
}
|
||||
|
||||
endwin() ; /* remet l'ecran dans son etat initial
|
||||
endwin() est obligatoire pour terminer
|
||||
correctement un pg utilisant curses */
|
||||
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,52 @@
|
|||
/* Mecanismes de communication entre processus - IPC */
|
||||
/* Creation d'une zone de mémoire interne partajée (shared memory - shm ) */
|
||||
#include <stdlib.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define SHMEM_SIZE 256
|
||||
#define SHMEM_RIGHTS 0x01ff
|
||||
|
||||
/* dimension de la zone : 255 octets */
|
||||
/* droits d'accès dans la zone de mémore partagée: 1ff */
|
||||
/* on nn'utilisera que le premier entier long pour l'exemple */
|
||||
|
||||
|
||||
int main (int argc, char ** argv) {
|
||||
|
||||
/* l'identificateur externe (key) de la zone de mémoire partagée
|
||||
est un nombre entier transmis en paramètre par l'utilisateur */
|
||||
|
||||
int ipc_key ;
|
||||
|
||||
int ipc_result ;
|
||||
char * pnl ;
|
||||
int i;
|
||||
|
||||
if (argc<2)
|
||||
exit(1);
|
||||
|
||||
ipc_key = atoi(argv[1]) ;
|
||||
|
||||
/* creation de la zone commune : primitive shmget (....) */
|
||||
|
||||
ipc_result = shmget(ipc_key, SHMEM_SIZE, IPC_CREAT|IPC_EXCL|SHMEM_RIGHTS) ;
|
||||
|
||||
if (ipc_result != -1) {
|
||||
printf(" - Succes !! -\n");
|
||||
|
||||
/* attachement à la zone de mémoire partagée : shmat (....) */
|
||||
|
||||
pnl = (char*)shmat(ipc_result, 0, SHMEM_RIGHTS) ;
|
||||
|
||||
/* initialisation avec 0 de la zone de mémoire partagée */
|
||||
for (i=0;i<SHMEM_SIZE;i++)
|
||||
pnl[i]='\0' ;
|
||||
}
|
||||
else
|
||||
printf(" Erreur :%d \n",ipc_result);
|
||||
|
||||
exit(0) ;
|
||||
}
|
||||
|
Binary file not shown.
|
@ -0,0 +1,82 @@
|
|||
/* Mecanismes de communication entre processus - IPC */
|
||||
/* Ecriture dans une zone de mémoire partajée */
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#define SHMEM_SIZE 0xff
|
||||
#define SHMEM_RIGHTS 0x01ff
|
||||
|
||||
int main (int argc, char ** argv) {
|
||||
long i , k , temp;
|
||||
long * ptz ;
|
||||
int p1 , p2, p3, p4;
|
||||
int ipc_key, ipc_result ;
|
||||
|
||||
if (argc<2)
|
||||
exit(1) ;
|
||||
|
||||
ipc_key = atoi(argv[1]) ;
|
||||
|
||||
srand ( time(0) ); // initialisation générateur
|
||||
|
||||
ipc_result = shmget(ipc_key, 0 , 0) ; // ouverture mémoire partagée
|
||||
|
||||
ptz = (long *) shmat(ipc_result, 0, SHMEM_RIGHTS) ; // attachement
|
||||
|
||||
if ((p1 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp;
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
// while(wait(0) != p1);
|
||||
|
||||
if ((p2 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp;
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
// while(wait(0) != p2);
|
||||
|
||||
if ((p3 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp;
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
// while(wait(0) != p3);
|
||||
|
||||
if ((p4 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp;
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
|
||||
printf("\n Arret processus pid = %d compteur = ( %d )\n\n", getpid(), *ptz) ;
|
||||
|
||||
|
||||
exit(0) ;
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,114 @@
|
|||
/* Mecanismes de communication entre processus - IPC */
|
||||
/* Ecriture dans une zone de mémoire partajée (shared memory - shm ) */
|
||||
|
||||
// VERSION AVEC SEMAPHORE
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#define SHMEM_SIZE 0xff
|
||||
#define SHMEM_RIGHTS 0x01ff
|
||||
|
||||
void erreur(char *mess);
|
||||
|
||||
int main (int argc, char ** argv) {
|
||||
long i , k , temp;
|
||||
long * ptz ;
|
||||
int p1 , p2, p3, p4;
|
||||
int ipc_key, ipc_result ;
|
||||
|
||||
int mutex; // id du semaphore
|
||||
|
||||
|
||||
if (argc<2)
|
||||
exit(1) ;
|
||||
ipc_key = atoi(argv[1]) ;
|
||||
|
||||
|
||||
ipc_result = shmget(ipc_key, 0 , 0) ; // ouverture mémoire partagée
|
||||
ptz = (long *) shmat(ipc_result, 0, SHMEM_RIGHTS) ; // attachement mémoire partagée
|
||||
|
||||
// creation du semaphore mutex
|
||||
|
||||
if((mutex = creat_sem(ipc_key+1,1)) == -1)
|
||||
erreur("erreur creation semaphore");
|
||||
|
||||
if ((p1 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
|
||||
P(mutex); //__________________________
|
||||
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp; ;
|
||||
|
||||
V(mutex); //________________________________
|
||||
|
||||
//(*ptz) ++ ;
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
if ((p2 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
|
||||
P(mutex); //__________________________
|
||||
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp;
|
||||
|
||||
V(mutex); //________________________________
|
||||
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
if ((p3 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
|
||||
P(mutex); //__________________________
|
||||
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp;
|
||||
|
||||
V(mutex); //________________________________
|
||||
|
||||
//(*ptz) ++ ;
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
if ((p4 = fork()) == 0) {
|
||||
for(i=0;i<10;i++) {
|
||||
|
||||
P(mutex); //__________________________
|
||||
|
||||
temp = * ptz;
|
||||
temp++;
|
||||
sleep( rand() % 2 ); // attente aléatoire
|
||||
*ptz = temp; ;
|
||||
//(*ptz) ++ ;
|
||||
|
||||
V(mutex); //________________________________
|
||||
}
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
// while(wait(0) != -1); si le père attend que tous ses fils soient terminés
|
||||
|
||||
// suppression du semaphore
|
||||
|
||||
//del_sem(mutex);
|
||||
|
||||
printf("\n Arret processus pid = %d compteur ( %d ) \n\n", getpid(), *ptz) ;
|
||||
|
||||
exit(0) ;
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,30 @@
|
|||
/* Mecanismes de communication entre processus - IPC */
|
||||
/* Lecture d'une zone de mémoire partagée */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#define SHMEM_SIZE 256
|
||||
#define SHMEM_RIGHTS 0x01ff
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
long * ptz ;
|
||||
int ipc_result, ipc_key ;
|
||||
|
||||
if (argc<2)
|
||||
exit(1) ;
|
||||
ipc_key = atoi(argv[1]) ;
|
||||
ipc_result = shmget(ipc_key, 0 , 0) ;
|
||||
ptz = (long *) shmat(ipc_result,0,SHMEM_RIGHTS) ;
|
||||
|
||||
printf("\n Valeur dans la zone partagee : %d \n\n", *ptz) ;
|
||||
exit(0) ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
Binary file not shown.
|
@ -0,0 +1,42 @@
|
|||
/* Mecanismes de communication entre processus - IPC */
|
||||
/*
|
||||
/* met a zero l' entier long de la mem par*/
|
||||
#include <stdlib.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define SHMEM_RIGHTS 0x01ff
|
||||
|
||||
/* droits d'accès dans la zone de mémore partgée: 1ff */
|
||||
|
||||
|
||||
int main (int argc, char ** argv) {
|
||||
|
||||
/* l'identificateur externe (key) de la zone de mémoire partagée
|
||||
est un nombre entier transmis en paramètre par l'utilisateur */
|
||||
int ipc_key ;
|
||||
|
||||
int ipc_result ;
|
||||
long *ptz;
|
||||
int i;
|
||||
|
||||
if (argc<2)
|
||||
exit(1);
|
||||
|
||||
ipc_key = atoi(argv[1]) ;
|
||||
|
||||
ipc_result = shmget(ipc_key, 0,0);
|
||||
|
||||
if (ipc_result != -1)
|
||||
{
|
||||
printf(" - Succes !! -\n");
|
||||
ptz = (long *) shmat(ipc_result, 0, SHMEM_RIGHTS) ;
|
||||
printf("remise a zero ( %ld ) ", *ptz);
|
||||
*ptz = 0;
|
||||
}
|
||||
else
|
||||
printf(" Erreur :%d \n",ipc_result);
|
||||
exit(0) ;
|
||||
}
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/sem.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
union semun
|
||||
{
|
||||
int val;
|
||||
struct semid_ds *buf;
|
||||
ushort *array;
|
||||
};
|
||||
|
||||
void erreur(char *s)
|
||||
{
|
||||
if(errno)
|
||||
perror(s);
|
||||
else
|
||||
fprintf(stderr,"%s\n",s);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
int creat_sem(key_t cle,int val)
|
||||
|
||||
/* creation du semaphore cle ayant comme valeur initiale val
|
||||
retourne un identificateur de semaphore >=0 ou -1 si erreur
|
||||
*/
|
||||
|
||||
{
|
||||
int semid ;
|
||||
|
||||
union semun arg;
|
||||
|
||||
if((semid=semget(cle,1,0666+IPC_CREAT+IPC_EXCL))>= 0)
|
||||
{
|
||||
arg.val=val;
|
||||
if(semctl(semid,0,SETVAL,arg)< 0)
|
||||
semid = -1;
|
||||
}
|
||||
return(semid);
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
|
||||
int del_sem(key_t cle)
|
||||
|
||||
/* destruction du semaphore cle
|
||||
retourne:
|
||||
0 si la destruction du semaphore s est effectuee correctement
|
||||
-1 si erreur
|
||||
*/
|
||||
{
|
||||
int semid;
|
||||
|
||||
if((semid = semget(cle,0,0)) >= 0)
|
||||
semid = semctl(semid,0,IPC_RMID,0);
|
||||
|
||||
if(semid != -1)
|
||||
semid = 0;
|
||||
return semid;
|
||||
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
int chuid_sem(int semid, uid_t uid)
|
||||
|
||||
/* change le owner's user id du semaphore semid en lui donnant la valeur
|
||||
uid
|
||||
retourne 0 si ok
|
||||
-1 si erreur
|
||||
*/
|
||||
{
|
||||
int ret;
|
||||
union semun arg;
|
||||
|
||||
struct semid_ds str_sema;
|
||||
|
||||
arg.buf = &str_sema;
|
||||
|
||||
if((ret = semctl(semid,0,IPC_STAT,arg)) != -1)
|
||||
{
|
||||
str_sema.sem_perm.uid = uid;
|
||||
ret = semctl(semid,0,IPC_SET,arg);
|
||||
}
|
||||
if(ret != -1)
|
||||
ret = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
int open_sem(key_t cle)
|
||||
|
||||
/* recherche le semaphore cle
|
||||
retourne l'identificateur du semaphore >=0 ou -1 si erreur
|
||||
*/
|
||||
{
|
||||
|
||||
return(semget(cle,0,0));
|
||||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
void P(int semid)
|
||||
|
||||
{
|
||||
struct sembuf psembuf;
|
||||
|
||||
psembuf.sem_op = -1;
|
||||
psembuf.sem_flg = 0;
|
||||
psembuf.sem_num = 0;
|
||||
semop(semid,&psembuf,1);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
|
||||
void V(int semid)
|
||||
|
||||
{
|
||||
struct sembuf vsembuf;
|
||||
|
||||
vsembuf.sem_op = 1;
|
||||
vsembuf.sem_flg = 0;
|
||||
vsembuf.sem_num = 0;
|
||||
semop(semid,&vsembuf,1);
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
void erreur(char * format, ...);
|
||||
int creat_sem(key_t cle,int val);
|
||||
int del_sem(key_t cle);
|
||||
int open_sem(key_t cle);
|
||||
void P(int semid);
|
||||
void V(int semid);
|
Binary file not shown.
|
@ -0,0 +1,49 @@
|
|||
/* travaille avec msgProd.c
|
||||
lit les messages du type donne en parametre sur la ligne de cde
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Defines */
|
||||
#define cle 17
|
||||
|
||||
typedef struct msgbuf_EXD
|
||||
{
|
||||
long type;
|
||||
char text [30];
|
||||
} MSGP;;
|
||||
|
||||
|
||||
/* Global variables */
|
||||
int msqid;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
MSGP *m = (MSGP *)malloc (sizeof(MSGP));
|
||||
int type;
|
||||
|
||||
if(argc!=2)
|
||||
{
|
||||
printf ( "usage : msgCons <type> " ) ;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
type = atoi(argv[1]);
|
||||
|
||||
msqid = msgget(cle, 0); // ouverture file message
|
||||
|
||||
// lecture
|
||||
|
||||
|
||||
while(msgrcv(msqid, m, sizeof(MSGP) ,type,1) != -1)
|
||||
{
|
||||
|
||||
// decodage du message
|
||||
|
||||
printf("un message de type %d recu ( %s )\n", m->type, m->text);
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
/* msgProd.c.c
|
||||
|
||||
works with msgCons.c
|
||||
|
||||
Create a message queue et saisit un message et un type et envoie le message
|
||||
*/
|
||||
|
||||
/* Includes */
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* Defines */
|
||||
#define cle 17
|
||||
|
||||
/* Global variables */
|
||||
int msqid;
|
||||
|
||||
#define TAILLE_NOM 15
|
||||
|
||||
|
||||
typedef struct msgbuf_EXD
|
||||
{
|
||||
long mtype;
|
||||
char text [30];
|
||||
} MSGP;;
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
/* Create the message queue */
|
||||
msqid = msgget(cle, IPC_CREAT|IPC_EXCL|0660);
|
||||
|
||||
/* Fill in the structure */
|
||||
MSGP m1,m2,m3;
|
||||
int type;
|
||||
char mess[20 ];
|
||||
|
||||
|
||||
printf("Taille de la structure MSGP = %d\n ", sizeof(MSGP));
|
||||
|
||||
while( 1)
|
||||
{
|
||||
printf("\nSaisir type destinataire ( 1-5 ) ");
|
||||
scanf("%d",&m1.mtype);
|
||||
printf("\nSaisir un message) ");
|
||||
scanf("%s", m1.text);
|
||||
|
||||
/* Send the message */
|
||||
msgsnd(msqid, &m1, sizeof(MSGP),0);
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
ce fichier sert a la fonction ftok pour generer une cle ipc
|
|
@ -0,0 +1,47 @@
|
|||
/* fichier test_msgctl.c */
|
||||
/*
|
||||
* le programme recupere l'identificateur d'une file existante (creee
|
||||
* avec test_msgget.c) et affiche la structure msqid_ds associee a la file
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#define CLE 123
|
||||
main()
|
||||
{
|
||||
struct msqid_ds buf ;
|
||||
char *path = "nom2_de_fichier_existant" ;
|
||||
int msqid ;
|
||||
/* recuperation de l'identificateur de la file de messages de cle 123 */
|
||||
if (( msqid = msgget(ftok(path,(key_t)CLE),0)) == -1 ) {
|
||||
perror ("Erreur msgget()") ;
|
||||
exit(1) ;
|
||||
}
|
||||
/* on recupere dans la structure buf les parametres de al file */
|
||||
if (msgctl(msqid,IPC_STAT,&buf) == -1){
|
||||
perror("Erreur msgctl()") ;
|
||||
exit(1) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("id de la file de messages : %d\n",msqid) ;
|
||||
printf("id du proprietaire : %d\n",buf.msg_perm.uid) ;
|
||||
printf("id du groupe du proprietaire : %d\n",buf.msg_perm.gid) ;
|
||||
printf("id du createur : %d\n",buf.msg_perm.cuid) ;
|
||||
printf("id du groupe du createur : %d\n",buf.msg_perm.cgid) ;
|
||||
printf("droits d'acces : %d\n",buf.msg_perm.mode) ;
|
||||
printf("nb courant d'octets dans la file : %d\n",buf.msg_cbytes) ;
|
||||
printf("nb de messages dans la file : %d\n",buf.msg_qnum) ;
|
||||
printf("nb maximal d'octets de la file : %d\n",buf.msg_qbytes) ;
|
||||
printf("pid du dernier ecrivain : %d\n",buf.msg_lspid) ;
|
||||
printf("pid du dernier lecteur : %d\n",buf.msg_lrpid) ;
|
||||
printf("date de la derniere ecriture : %s\n",ctime(&buf.msg_stime)) ;
|
||||
printf("date de la derniere lecture : %s\n",ctime(&buf.msg_rtime)) ;
|
||||
printf("date du dernier changement : %s\n",ctime(&buf.msg_ctime)) ;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
#define NPLEIN 1
|
||||
#define NVIDE 2
|
||||
#define MUTEX_1 3
|
||||
#define MUTEX_2 4
|
||||
#define MAX_PROD 5 // Maximum de producteurs
|
||||
#define MAX_BUF 100 // Taille maximale du buffer
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,2 @@
|
|||
CC=gcc
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/sem.h>
|
||||
|
||||
|
||||
/*void erreurMes(char * format, ...)
|
||||
{
|
||||
char texte[200];
|
||||
va_list liste_arguments;
|
||||
|
||||
va_start(liste_arguments,format);
|
||||
|
||||
vsnprintf(texte,200,format,liste_arguments);
|
||||
|
||||
va_end(liste_arguments);
|
||||
|
||||
if(errno)
|
||||
perror(texte);
|
||||
else
|
||||
fprintf(stderr,texte);
|
||||
exit(1);
|
||||
}
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
int creat_sem(key_t cle,int val)
|
||||
|
||||
/* creation du semaphore cle ayant comme valeur initiale val
|
||||
retourne un identificateur de semaphore >=0 ou -1 si erreur
|
||||
*/
|
||||
|
||||
{
|
||||
int semid;
|
||||
|
||||
union semun{
|
||||
int val;
|
||||
struct semid_ds *buf;
|
||||
ushort *array;
|
||||
} arg;
|
||||
|
||||
if((semid=semget(cle,1,0666+IPC_CREAT+IPC_EXCL))>= 0)
|
||||
{
|
||||
arg.val=val;
|
||||
if(semctl(semid,0,SETVAL,arg)< 0)
|
||||
semid = -1;
|
||||
}
|
||||
return(semid);
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
|
||||
int del_sem(key_t cle)
|
||||
|
||||
/* destruction du semaphore cle
|
||||
retourne:
|
||||
0 si la destruction du semaphore s est effectuee correctement
|
||||
-1 si erreur
|
||||
*/
|
||||
{
|
||||
|
||||
return(semctl((semget(cle,0,0)),0,IPC_RMID,0));
|
||||
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
int open_sem(key_t cle)
|
||||
|
||||
/* recherche le semaphore cle
|
||||
retourne l'identificateur du semaphore >=0 ou -1 si erreur
|
||||
*/
|
||||
{
|
||||
|
||||
return(semget(cle,0,0));
|
||||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
void P(int semid)
|
||||
|
||||
{
|
||||
struct sembuf psembuf;
|
||||
|
||||
psembuf.sem_op = -1;
|
||||
psembuf.sem_flg = 0;
|
||||
psembuf.sem_num = 0;
|
||||
semop(semid,&psembuf,1);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
|
||||
void V(int semid)
|
||||
|
||||
{
|
||||
struct sembuf vsembuf;
|
||||
|
||||
vsembuf.sem_op = 1;
|
||||
vsembuf.sem_flg = 0;
|
||||
vsembuf.sem_num = 0;
|
||||
semop(semid,&vsembuf,1);
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
void erreur(char *s);
|
||||
int creat_sem(key_t cle,ushort val);
|
||||
int del_sem(key_t cle);
|
||||
int open_sem(key_t cle);
|
||||
void P(int semid);
|
||||
void V(int semid);
|
||||
|
Binary file not shown.
|
@ -1,14 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main( int argc, char **argv, char **envp)
|
||||
{
|
||||
// I will display all the environment variables
|
||||
while(*envp != NULL)
|
||||
{
|
||||
printf("%s\n", *envp);
|
||||
*envp++;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue