1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
pv.h
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
extern int errno;
#define SEMPERM 0600
#define TRUE 1
#define FALSE 0
#define SEMKEY 0*200
#define SEMKEYSTR "0*200"
union _semun{
int val;
struct semid_ds *stat;
unsigned short *array;
}
int p (int semid);
int v (int semid);
int initsem (key_t semkey);
void handlesem (key_t semkey);
***********************
/* initsem.c -- semaphore initialisation */
#include "pv.h"
int initsem(key_t semkey)
{
int status = 0, semid;
union semun arg;
arg.val = 1;
if((semid = semget(semkey, 1, SEMPERM|IPC_CREAT|IPC_EXCL)) == -1)
{
if (errno ==EEXIST)
semid = semget(semkey, 1, 0);
}
else /* if created ... */
{
status = semctl(semid, 0, SETVAL, arg);
}
if (semid == -1 || status == -1)
{
perror("initsem failed");
return(-1);
}
/* all okay */
else
return(semid);
}
void removesem (char *key)
{
execlp ("ipcrm", "ipcrm", "-S", key,(char *) 0);
*************************
pc.c
#include "pv.h"
int p(int semid){
struct sembuf p_buf;
p_buf.sem_num = 0;
p_buf.sem_op = -1;
p_buf.sem_flg = SEM_UNDO; /* undoes operation if process exits! */
if (semop(semid, &p_buf, 1) == -1)
{
perror("p(semid) failed");
exit(1);
}
else
return (0);
}
//p()
***************************
vc.c
#include "pv.h"
int v(int semid){
struct sembuf v_buf;
v_buf.sem_num = 0;
v_buf.sem_op = 1;
v_buf.sem_flg = SEM_UNDO;
if (semop(semid, &v_buf, 1) == -1){
perror("v(semid) failed");
exit(1);
} else
return(0);
}//v()
****************************
testsem.c
/* program for testing p() and v() -- gets mutual exclusion */
#include "pv.h"
int main(void){
key_t semkey = SEMKEY;
if(fork() == 0) handlesem(semkey);
else if(fork() == 0) handlesem(semkey);
else if(fork() == 0) handlesem(semkey);
while (wait ((int *) 0) >=0)
removesem (semkeystr);
return 0;
}//main()
void handlesem(key_t skey){
int semid, pid = getpid();
/* initialize the semaphore if we just created it */
if ((semid = initsem(skey)) < 0) exit(1);
printf("\nprocess %d BEFORE critical section\n", pid);
p(semid);
printf("\nprocess %d in critical section \n", pid);
sleep(10);
printf("\nprocess %d leaving critical section \n", pid);
v(semid); /* call semaphore SIGNAL operation */
printf("\nprocess %d is OUTSIDE critical section and quitting!\n", pid);
exit(0);
} |
Partager