» »

skupni pomnilnik © linux

skupni pomnilnik © linux

roba87 ::

imam težavo pri nalogi :

Napišite dva programa (shm1a.c in shm1b.c), ki medsebojno komunicirata preko skupnega pomnilnika.

Naloge prvega programa (shm1a.c), ki se izvajajo v zapisanem zaporedju, so naslednje:

* Ustvari skupen pomnilnik, ki je velik 1 celo število (int).
* Vrednost skupnega pomnilnika postavi na 0.
* Izvaja prazno while zanko dokler je vrednost iz skupnega pomnilnika 0 (temu pravimo tudi "spinlock" oz. "vrtavka").
* Ko se vrednost v skupnem pomnilniku spremeni oz. je različna 0, program poskuša pobrisati skupen pomnilnik.

Naloge drugega programa (shm1b.c), ki ga zaženemo vedno za prvim, so:

* V skupen pomnilnik, ki ga je že ustvaril prvi program, zapiše svoj PID.
* Poskuša pobrisati skupen pomnilnik.

Ko končata izvajanje oba programa, skupnega pomnilnika na sistemu ne sme več biti. V to se lahko prepričate s programom ipcs.

Kot ključ, s katerim ustvarjamo skupen pomnilnik, uporabite vašo vpisno številko E1000000, kjer odstranite prvi znak 'E'.


program :


// shm1a

#include <sys/shm.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <errno.h>

int main()
{
	int *kazalec;
	int  pom;
	int shmid;
	shmid = shmget (1000000, 1*sizeof(int), IPC_CREAT | IPC_EXCL | 0600);
	if(shmid<0)
	{
		perror ( "error" );
		printf ( "napaka : %d\n ", errno);
	}
	else
	{
		printf ( "ni napake\n" );
	}
	kazalec = (int*)shmat(shmid,(void*)0, 0);
	if(kazalec==(int*)-1)
	{
		perror ( "ni kazalca" );
		return -1;
	}
	kazalec = 0;
	while (kazalec==0)
	{
	}
	shmdt(kazalec);
	if(pom<0)
	{
		perror ( "error" );
		return -1;
	}
	pom = shmctl(shmid, IPC_RMID,0);
	if(pom!=0)
	{
		printf ( "skupni pomnilnik izbrisan" );
	}
	else
	{
		return (errno);
	}
	return 0;
}
 

//shm1b :

#include <sys/shm.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <errno.h>

int main()
{
	int shmid;
	int pom;
	int *kazalec;
	shmid = shmget(1000000, 1*sizeof(int), IPC_CREAT | 0600);
	kazalec = (int *) shmat(shmid, (void *)0, 0);
	*kazalec = getpid();
	shmdt(kazalec);
	pom = shmctl (shmid, IPC_RMID,0);
	if (pom!=0)
	{
		printf ( "pomnilnik zbrisan" );
	}
	return 0;
}


Problem je v tem da se shm1a nikoli ne konča. Nekaj sem poskušal med while (kazalec==0) {} vstavljat pa mi ni uspelo.
  • spremenil: Senitel ()

krneki0001 ::

Ker vidim, da sva ali sošolca na izrednem, ali pa si na rednem faks v mariboru, ti bom mal pomagal

shm1a.c
#include <sys/shm.h>
#include <errno.h>

int main()
{
  int shmid;
  int* kazalec;
  shmid=shmget(1000000,sizeof(int),IPC_CREAT | 0600);
  printf("Izvajanje shm1a\n");
  kazalec=(int *)shmat(shmid,(void *)0, 0);
  *kazalec=0;
 
  while (*kazalec==0)
  {
  }

  if (shmid<0)
  {
    perror("Napaka");
    return(errno);
  }

  int i=shmctl(shmid,IPC_RMID,0);
  if (i==0)
  {
    printf("Skupni pomnilnik smo pobrisali\n");
  }
  else
  {
    return(errno);
  }
  shmdt(kazalec);
  shmctl(shmid,IPC_RMID,0);


}


shm1b.c
#include <sys/shm.h>
#include <errno.h>

int main()
{
  int shmid;
  int* kazalec;
  printf("Izvajanje shm1b\n");
  shmid=shmget(10000000,0, 0); 
  if (shmid<0)
  {
    perror("Napaka: Proces ne obstaja.");
    return(errno);
  }
  
  kazalec=(int *)shmat(shmid,(void *)0, 0);
  if (kazalec==(void *)-1)
  {
    perror("Ni kazalca");
    return -1;
  }

  *kazalec=getpid();

  if (shmid<0)
  {
    perror("Napaka");
    return(errno);
  }

  int i=shmctl(shmid,IPC_RMID,0);
  if (i==0)
  {
    printf("Skupni pomnilnik je pobrisan!\n");
  }
  else
  {
    return(errno);
  }
  shmdt(kazalec);
  shmctl(shmid,IPC_RMID,0);
}

Zgodovina sprememb…

  • spremenil: Senitel ()

krneki0001 ::

Kok si pisal vmesni izpit in zagovor vaj? Jst imam zdej 300 pik, še 100 od vaj(ni še napisal rezultatov) in še 200 od seminarske pa 29 avgusta sploh ne grem pisat drugega izpita, če jih bom 600 nabral.

roba87 ::

uh, hvala ti lepa. Zgleda da sma sošolca pri tem predmetu :) . Jaz mam 192 semiarsko pa vaje mam zdaj nekje 100 (manjka mi še 3 sklop - to je minimum 45), na izpit pa še ne morem ker nimam vaj oddanih vseh (nisem šel na kolokvije).

Zgodovina sprememb…

  • spremenil: roba87 ()

krneki0001 ::

Si redni? Jst sm izredni, ampak vaje imamo očitno enake, ker mi moramo oddat seminarsko šele do konca tega tedna.

Če še ktero vajo rabiš, jo lahko tut postam.

Zgodovina sprememb…

roba87 ::

Redni sem ja. Hvala, mam ostale vse oddane.

Keki ::

Uf ki so že Operacijski Sistemi :D
http://www.alfakan.si/
http://mihajerot.si/


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Niti - segmentation fault

Oddelek: Programiranje
211858 (705) galu
»

c++ fork()

Oddelek: Programiranje
61312 (628) Randomness
»

[C] Sinhronizacija procesov

Oddelek: Programiranje
71038 (911) Cvenemir
»

ne zazna 3 G ramov ampak 2558 zakaj ??

Oddelek: Pomoč in nasveti
282877 (2339) Zheegec
»

Problem pri uporabi niti (threade) C++

Oddelek: Programiranje
10967 (822) rabbit-zek

Več podobnih tem