Witam. Piszę program, którego działanie jest następujące:
tworzy segment pamięci dzielonej o wielkości pozwalającej na zapis zmiennej typu int
tworzy dwa opuszczone semafory
w pętli wykonuje: opuszcza semafor 2, odczekuje losowy czas od 0 do 1 sekundy, wpisuje kolejną (poczynając od 1) liczbę do zmiennej dzielonej, podnosi semafor 1
Napisałem coś takiego:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <time.h>
#include <sys/sem.h>
static struct sembuf op_lock[1] = { //funkcja opuszczajaca semafor
0, -1, 0
};
static struct sembuf op_unlock[1] = { //funkcja podnoszaca semafor
0, 1, 0
};
int main() {
int sem1;
int sem2;
int shmid;
int *zm;
int i;
//tworzenie bloku pamieci dzielonej
if ((shmid = shmget(ftok("/tmp/",3), sizeof(int), IPC_CREAT)) == -1)
perror("SHMID");
//tworzenie zmiennej dzielonej
if ((zm = (int*)shmat(shmid, NULL, 0)) == NULL)
perror("SHMAT");
*zm = 1; //przypisanie wartosci poczatkowej zmiennej dzielonej
//utworzenie semaforow
if ((sem1 = semget(ftok("/tmp",0), 1, IPC_CREAT | 0666)) < 0)
perror("blad tworzenia semafora");
if ((sem2 = semget(ftok("/tmp",0), 1, IPC_CREAT | 0666)) < 0)
perror("blad tworzenia semafora");
for(i = 0; i++; i < 10) {
semop(sem2, &op_lock[0], 1);//opuszczenie semafora 2
sleep(rand() % 1 + 0);//zatrzymanie programu od 0 do 1 sekundy
*zm = *zm+1;//zwiekszenie wartosci zmiennej dzielonej
printf("%d", *zm);//wypisanie jej
semop(sem1, &op_unlock[0], 1);//opuszczenie semafora 1
}
return 0;
}
Jednak po uruchomieniu programu wyskakuje błąd: Naruszenie ochrony pamięci(core dumped). Gdzie popełniłem błąd?