All pastes #769839 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-11-11 18:33 UTC
rendered paste body
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>


/* deklaracija globalnih varijabli */
int Id; /* identifikacijski broj segmenata */
int *A;
int N;

/* pocetak opisa posla procesa */
void posao_procesa(int brojac, int M){
	*A+=M;
	printf("Vrijednost varijable A za proces %d: A=%d\n", brojac, *A);
}

/* oslobadanje memorije u slucaju prekida */
void brisi(void){
	int i;
	for(i=1; i<N; i++){
		if (shmctl(i, IPC_RMID, NULL) != -1)
			printf("Obrisao zajednicku memoriju %d\n", i);
		if (semctl(i, 0, IPC_RMID, 0) != -1)
			printf("Obrisao skup semafora %d\n", i);
		if (msgctl(i, IPC_RMID, NULL) != -1)
			printf("Obrisao red poruka %d\n", i);
	}
   exit(0);
}

/* pocetak glavnog programa */
int main (int argc, char *argv[]){
	int M, i;

	if(argc!=3){	/* upute korisniku u slucaju greske */
 	    printf("Greska pri pokretanju programa procesi!\n");
		printf("Unesite broj procesa i broj povecanja\n");
		printf("npr ./procesi 5 10000\n");
        return 1;
    }

	Id = shmget(IPC_PRIVATE, sizeof(int)*100, 0600);

	if (Id == -1)
		exit(1); /* greska - nema zajednicke memorije */

	N=atoi(argv[1]);
	M=atoi(argv[2]);

	A=(int *) shmat(Id, NULL, 0);
	*A=M;

	printf("Vrijednost varijable A za proces roditelj: A=%d\n", *A);

	sigset(SIGINT, brisi); /* prijevremeni prekid */

	/* pokretanje paralelnih procesa */
	for(i=1; i<=N; i++){
		switch(fork()){
			case 0:
				posao_procesa(i, M);
				exit(0);
			case -1:
				printf("\nNe mogu stvoriti proces\n");
				exit(-1);
			default:
				sleep(1);
				break;
		}
	}
	while (i--) wait (NULL);

	brisi();
	return 0;
}