semaphore program on c

Share:

sender.c------

#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/types.h>#include<sys/shm.h>#include<string.h>#include<sys/sem.h>
#define SEMNUMBER 1 

int main(){    key_t key;    int shmflag;    int shmid;    int shmsize = 27;    char *shmaddr;    char *shmbuf;    char c;    int semflag;    int semid;    short semaphore[SEMNUMBER];    int i;    struct sembuf sembuffer[1];
    if ((key = ftok( "/opt", 101)) == -1){        printf("Failed to create unique key \n");        exit(0);    }    shmflag = IPC_CREAT | 0666;        if ((shmid = shmget(key,shmsize,shmflag)) == -1){           printf("Failed to get a message queue identifier\n");                  exit(0);    }
    printf("....Welcome To Shared Memory IPC Mechanism\n");
    if ((shmaddr = shmat(shmid, NULL, 0)) == (char *) -1){        printf("shmat failed\n");                  perror("shmat:");        exit(0);    }
    semflag = IPC_CREAT | 0666;
    if((semid = semget(key, SEMNUMBER, semflag)) == -1){           printf("Failed to get a Semaphore identifier\n");                  perror("semget:");           exit(0);    }
    printf("Hey.... Now you are using Semaphore also\n");
    for(i=0; i < SEMNUMBER; i++){        semaphore[i] = 0;    }
    if(( semctl(semid, 1, SETALL, semaphore)) == -1){        printf("Set semaphore control failed\n");                  perror("semctl:");        exit(0);    }
        shmbuf = shmaddr;
    for ( c = 'a'; c <= 'z' ; c++){        sembuffer[0].sem_num = 0;        sembuffer[0].sem_op = 1;        sembuffer[0].sem_flg = 0;                if(( semop(semid, sembuffer, 1)) == -1){            printf("1.Failed in Semaphore operation\n");                          perror("semop:");            exit(0);        }        sleep(1);            *shmbuf++ = c;
        sembuffer[0].sem_num = 0;        sembuffer[0].sem_op = -1;        sembuffer[0].sem_flg = 0;                if(( semop(semid, sembuffer, 1)) == -1){            printf("2.Failed in Semaphore operation\n");                          perror("semop:");            exit(0);        }
    }
    *shmbuf = '\0';    
        while(*shmaddr != '*')        sleep(1);    return 0;}


receiver.c--------

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/ipc.h>#include<sys/types.h>#include<sys/shm.h>#include<signal.h>#include<sys/sem.h>
#define SEMNUMBER 1
void shmquit();
int shmid;    int semid;
int main(){    int key;    int shmflag;    int shmsize = 27;    char *shmaddr;    char *shmbuf;    int semflag;    short semaphore[SEMNUMBER];    int i;    struct sembuf sembuffer[1];
    if ((key = ftok( "/opt", 101)) == -1){        printf("Failed to create unique key \n");        exit(0);    }
     shmflag = IPC_CREAT | 0666;
    if ((shmid = shmget(key,shmsize, shmflag)) == -1){           printf("Failed to get a shared memory identifier\n");                  exit(0);    }    printf("....Welcome To Shared Memory IPC Mechanism\n");
    semflag = IPC_CREAT | 0666;
    if(( semid = semget(key, SEMNUMBER, semflag)) == -1){           printf("Failed to get a Semaphore identifier\n");                  exit(0);    }            printf("Hey now you are using semaphore also\n");
    for(i=0; i<SEMNUMBER; i++){        semaphore[i] = 0;    }
    if(( semctl(semid, 1, SETALL, semaphore)) == -1){           printf("semaphore control Failed\n");                  exit(0);    }
    signal(SIGINT, (void *)shmquit);
    while(1){            sembuffer[0].sem_num = 0;        sembuffer[0].sem_op = 1;        sembuffer[0].sem_flg = 0;
        if(( semop(semid, sembuffer, 1)) == -1){            printf("Failed in semaphore operation\n");            exit(0);        }
        if( (shmaddr = shmat(shmid, NULL, 0)) == (char *) -1){            printf("Shmat failed\n");            exit(0);        }            printf("%s",shmaddr);        putchar('\n');
        if( (shmdt(shmaddr)) == -1){            printf("Shmdt failed\n");            exit(0);        }                sembuffer[0].sem_num = 0;        sembuffer[0].sem_op = -1;        sembuffer[0].sem_flg = 0;
        if(( semop(semid, sembuffer, 1)) == -1){            printf("Failed in semaphore operation\n");            exit(0);        }
    }    *shmaddr = '*';    return 0;}void shmquit(){    signal(SIGINT, (void *)shmquit);            shmctl(shmid, IPC_RMID, 0);         semctl(semid,0, IPC_RMID);         printf(" \nThank you for using Shared memory and semaphore .... DONE\n");            exit(0);
}