Pamięć dzielona i semafory

0

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?

0

Uruchom program pod debugerem i leć krok po kroku i zobaczysz w którym miejscu leci masz segfaulta.

0

Po wywaleniu tego z kodu:

*zm = 1; 

i uruchomieniu programu program się uruchamia, nic nie robi, nawet nic nie wyświetla i się kończy. Ale w takim razie jak mam przypisać wartość do zmiennej dzielonej?

0

Błąd się pewnie nie pojawia bo shmat nie zwraca nulla tylko -1 w przypadku błędu...
A spróbuj tak:

if ((shmid = shmget(123456,sizeof(int), 0600 | IPC_CREAT))<0){
    perror("SHMID");
}
if(shmat(shmid, NULL, 0) < 0){
    perror("SHMAT");
}
zm = (int*)shmat(shmid, NULL, 0);
*zm = 1;
0

Teraz jest ok, faktycznie przypisuje tą zmienną. Jednak nadal program po uruchomieniu nic nie robi. A mam przecież w pętli printfy.

0

Och tak? A w jakiej pozycji semafor jest początkowo?

1 użytkowników online, w tym zalogowanych: 0, gości: 1