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
|
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include <error.h>
#define SHM_SIZE 1024
union semun{ int val; struct semid_ds *buf; unsigned short *array; struct seminfo *buf_info; void *pad; };
int creatsem(const char *pathname, int proj_id, int members, int init_val) { key_t msgkey; int index, sid; union semun semopts; if((msgkey = ftok(pathname, proj_id)) == -1){ perror("ftok error!\n"); return -1; } if((sid = semget(msgkey, members, IPC_CREAT|0666)) == -1){ perror("semget call failed.\n"); return -1; } semopts.val = init_val; for(index = 0; index < members; index++){ semctl(sid, index, SETVAL, semopts); } return sid; }
int opensem(const char *pathname, int proj_id) { key_t msgkey; int sid; if((msgkey = ftok(pathname, proj_id)) == -1){ perror("ftok error!\n"); return -1; } if((sid = semget(msgkey, 0, 0666)) == -1){ perror("open semget call failed.\n"); return -1; } return sid; }
int sem_p(int semid, int index) { struct sembuf sbuf = {0, -1, IPC_NOWAIT}; if(index < 0){ perror("index of array cannot equals a minus value!\n"); return -1; } sbuf.sem_num = index; if(semop(semid, &sbuf, 1) == -1){ perror("A wrong operation to semaphore occurred!\n"); return -1; } return 0; }
int sem_v(int semid, int index) { struct sembuf sbuf = {0, 1, IPC_NOWAIT}; if(index < 0){ perror("index of array cannot equals a minus value!\n"); return -1; } sbuf.sem_num = index; if(semop(semid, &sbuf, 1) == -1){ perror("A wrong operation to semaphore occurred!\n"); return -1; } return 0; }
int sem_delete(int semid) { return (semctl(semid, 0, IPC_RMID)); }
int wait_sem(int semid, int index) { while(semctl(semid, index, GETVAL, 0) == 0) { usleep(500); } return 1;
}
int creatshm(char *pathname, int proj_id, size_t size) { key_t shmkey; int sid; if((shmkey = ftok(pathname, proj_id)) == -1){ perror("ftok error!\n"); return -1; } if((sid = shmget(shmkey, size, IPC_CREAT|0666)) == -1){ perror("shm call failed!\n"); return -1; } return sid; }
int deleteshm(int sid) { void *p = NULL; return (shmctl(sid, IPC_RMID, p)); }
|