Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/sem.h>
- #include <signal.h>
- int semid;
- int shmid;
- char *shmp;
- static struct sembuf op_lock1[1] = {0,-1,0};
- static struct sembuf op_unlock1[1] = {0,1,0};
- static struct sembuf op_lock2[2] = {1,-1,0};
- static struct sembuf op_unlock2[1] = {1,1,0};
- void blokuj_sem1(int semid){
- if(semop(semid, &op_lock1[0],1)<0)
- perror("blad lokowania semafora");
- }
- void odblokuj_sem1(int semid){
- if(semop(semid,&op_unlock1[0],1)<0)
- perror("blad odblokowania semafora");
- }
- void blokuj_sem2(int semid){
- if(semop(semid, &op_lock2[0],1)<0)
- perror("blad lokowania semafora");
- }
- void odblokuj_sem2(int semid){
- if(semop(semid,&op_unlock2[0],1)<0)
- perror("blad odblokowania semafora");
- }
- void obsluga_zakonczenia_serwera(int nr_sig){
- printf("zakonczenie serwera\n");
- if(shmdt(shmp)<0)
- perror("blad odliczania pamieci dzielonej");
- if(semctl(semid,0,IPC_RMID,0)<0)
- perror("blad usuwania zbiorow semaforow");
- if(shmctl(shmid,IPC_RMID,NULL)<0)
- perror("blad usuwania pamieci dzielonej");
- exit(1);
- }
- int main(){
- signal(SIGINT, obsluga_zakonczenia_serwera);
- srand(getpid());
- shmid = shmget(ftok("serwer.c",3), sizeof(int),IPC_CREAT | IPC_EXCL | 0666);
- if(shmid == -1)
- perror("blad tworzenia pamieci dzielonej");
- shmp = shmat(shmid,0,0);
- if(shmp == NULL)
- perror("blad dolaczenia pamieci dzielonej");
- semid=semget(ftok("serwer.c",3),2,IPC_CREAT | 0666);
- if(semid< 0)
- perror("blad tworzenia zbioru semaforow");
- int liczba = 1;
- while(1){//petla oczekujaca 1 sek
- blokuj_sem2(semid);
- int time = rand()%1000001;
- printf("Spie przez %d\n",time);
- *shmp = liczba;
- liczba++;
- odblokuj_sem1(semid);
- usleep(time);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement