Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/sem.h>
- #include <unistd.h>
- #define SEM_COUNT 16
- #define SEM_FSYNC "/tmp/sem.temp", 1
- union semun {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- } arg;
- int semid;
- /* SIGINT handler for delete semophores */
- void sigint_handler(int signo) {
- /* Delete semaphores */
- int result = semctl(semid, SEM_COUNT, IPC_RMID);
- if (result == -1)
- perror("No can delete XSI semophores: ");
- printf("Exit from program.\n");
- exit(0);
- }
- int main() {
- /* Get key from ftok() */
- key_t key = ftok(SEM_FSYNC);
- /* Create XSI semaphores */
- semid = semget(key, SEM_COUNT, IPC_CREAT | IPC_EXCL | 0666);
- if (semid == -1) {
- perror("No can create semophores: ");
- return -1;
- }
- printf("Make semaphores with SEMID: %d\n", semid);
- unsigned short array[SEM_COUNT];
- for (int i = 0; i < SEM_COUNT; i++)
- array[i] = i;
- arg.array = array;
- int result = semctl(semid, 0, SETALL, arg);
- if (result == -1) {
- perror("No can init semophores: ");
- }
- /* Getting values from semophores */
- int value;
- for (int i = 0; i < SEM_COUNT; i++) {
- value = semctl(semid, i, GETVAL);
- printf("sem[%02d] have value: %d\n", i, value);
- }
- /* Set signal handlers */
- struct sigaction siga;
- siga.sa_handler = sigint_handler;
- sigemptyset(&siga.sa_mask);
- siga.sa_flags = 0;
- sigaction(SIGINT, &siga, NULL);
- sigaction(SIGTERM, &siga, NULL);
- sigaction(SIGABRT, &siga, NULL);
- /* Waiting Ctrl+C */
- for(;;)
- pause();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement