rendered paste body#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <values.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<MAXLONG; 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;
}