» »

[C] Semafor

[C] Semafor

Ciklamen ::

Pozdravljeni.

Že dalj časa se zafrkavam z nalogo za faks, pa mi nikakor ne uspe naredit..

Naloga se glasi:

shm1a

program shm1a ustvari še en skupen pomnilnik, ki bo sprejel niz dolg 20 znakov,
nato v vrtavki "počaka", da mu proces shm1b sporoči, da je napolnil drugi skupni pomnilnik s "pametnimi" podatki,
preden se zaključi, izpiše na zaslon podatke iz drugega skupnega pomnilnika.

shm1b

poveže se na nov skupni pomnilnik in ga napolni z razumljivimi podatki (niz naj bo dolg cca 20 znakov, kot je velik skupni pomnilnik),
"sporoči" prejšnjemu procesu, da je končal z operacijo (ostane enako kot prejšnji teden).

Nato ponovno napišite dva programa (shm2a in shm2b), kjer popolnoma enak problem rešite s pomočjo semaforja. Namig: prvi (signalni) skupni pomnilnik in vrtavko nadomestite s semaforjem.


shm1a in shm1b imam narejena, problem se mi sedaj pojavlja pri shm2a (prejšnji teden je še delalo ok?) ko mi ne ustvarja semaforja/skupnega pomnilnika

evo še koda:


SHM2A


#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/sem.h>

int main() {
	int shmid, sem_id;
	char* k;
	struct sembuf sem;

	shmid=shmget(1004, sizeof(20), IPC_EXCL|IPC_CREAT|0600);

	if(shmid<0) {
		printf("Napaka shmid!\n");
	}
	else {
		printf("OK\n");	
	}

	k=(char*)shmat(shmid,(void*)0,0);
	if(k==(char*)-1) {
		printf("Napaka k!\n");
	}
	else {
		printf("OK\n");
	}

	k="";
	sem_id=semget(1005,1,IPC_CREAT|IPC_EXCL|0600);

	if(sem_id<0) {
		printf("Napaka sem_id!\n");
	}
	else {
		printf("OK\n");
	}

	semctl(sem_id,0,SETVAL,1);

	sem.sem_flg=0;
	sem.sem_num=0;
	sem.sem_op=-1;
	semop(sem_id,&sem,1);
	printf(k);
	sem.sem_op=1;
	semop(sem_id,&sem,1);

	semctl(sem_id,0,IPC_RMID);
	shmctl(shmid,IPC_RMID,0);

	shmdt(k);

	return 0;	
}




SHM2B



#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/sem.h>

int main() {
	int shmid, sem_id;
	char* k;
	struct sembuf sem;

	shmid=shmget(1004,0,0);

	if(shmid<0) {
		printf("Napaka shmid!\n");
	}
	else {
		printf("OK\n");
	}

	k=(char*)shmat(shmid,(void*)0,0);

	if(k==(char*)-1) {
		printf("Napaka k!\n");
	}
	else {
		printf("OK\n");
	}

	sem_id=semget(1005,0,0);
	if(sem_id<0) {
		printf("Napaka sem_id\n");
		return 1;
	}
	else {
		printf("OK\n");
	}

	semctl(sem_id,0,SETVAL,1);

	sem.sem_op=-1;
	sem.sem_flg=0;
	sem.sem_num=0;
	semop(sem_id,&sem,1);
	k="Niz dolg 20 znakov..";
	sem.sem_op=-1;
	semop(sem_id,&sem,1);

	shmdt(k);

	return 0;
}



Če bi mi lahko kdo pomagal pri omenjeni nalogi bi bil neskončno hvaležen, ker sam je ne uspem razrešit...

Naj še enkrat povem, prejšnji teden mi je shm2a delal normalno, nisem popolnoma nič spreminjal v kodi, sedaj pa mi ne dela..
- End of the Post ->

Qcube ::

Nisem nikoli programiral semaforjev, samo iz firbca me je zanimalo kako delujejo. Imam shranjena dva zaznamka s primeri kode, če ti kaj pomaga pri iskanju napake.

http://beej.us/guide/bgipc/output/html/...
http://snap.nlc.dcccd.edu/learn/fuller3...

Ciklamen ::

Qcube hvala, imamo tudi na strani za vaje literaturo, ampak i fail to see where the problem is..
- End of the Post ->

Ciklamen ::

OK ker ne morem editirat več svojega prejšnjega posta...uspelo mi je sestavit tak daleč, da dela shm2a, ne dela pa shm2b (nek problem je s semaforjem - izpiše mi "napaka sem_id")

evo kodi še enkrat:


shm2a

#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>

int main() {
	int shmid, sem_id;
	char* k;
	struct sembuf sem;

	shmid=shmget(1005, sizeof(20), IPC_CREAT|IPC_EXCL|0600);

	if(shmid<0) {
		printf("Napaka shmid!\n");
	}
	else {
		printf("OK\n");	
	}

	k=(char*)shmat(shmid,(void*)0,0);
	if(k==(char*)-1) {
		printf("Napaka k!\n");
	}
	else {
		printf("OK\n");
	}

	strcpy(k,"");
	sem_id=semget(1006,1,IPC_EXCL|IPC_CREAT|0600);

	if(sem_id<0) {
		printf("Napaka sem_id!\n");
	}
	else {
		printf("OK\n");
	}

	semctl(sem_id,0,SETVAL,1);

	sem.sem_flg=0;
	sem.sem_num=0;
	sem.sem_op=0;
	semop(sem_id,&sem,1);
	sem.sem_op=-1;
	semop(sem_id,&sem,1);
	printf("V pomnilniku: %s\n ",k);
	sem.sem_op=1;
	semop(sem_id,&sem,1);

	shmdt(k);
	
	shmctl(shmid,IPC_RMID,0);
	semctl(sem_id,0,IPC_RMID);

	return 0;	
}



Shm2b


#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<string.h>

int main() {
	int shmid, sem_id;
	char* k;
	struct sembuf sem;

	shmid=shmget(1005,0,0);

	if(shmid<0) {
		printf("Napaka shmid!\n");
	}
	else {
		printf("OK\n");
	}

	k=(char*)shmat(shmid,(void*)0,0);

	if(k==(char*)-1) {
		printf("Napaka k!\n");
	}
	else {
		printf("OK\n");
	}

	sem_id=semget(1005,1,0600);
	if(sem_id<0) {
		printf("Napaka sem_id\n");
	}
	else {
		printf("OK\n");
	}

	semctl(sem_id,0,SETVAL,1);

	sem.sem_op=-1;
	sem.sem_flg=0;
	sem.sem_num=0;
	semop(sem_id,&sem,1);
	strcpy(k,"niz dolg 20 znakov..");
	sem.sem_op=1;
	semop(sem_id,&sem,1);

	shmdt(k);

	return 0;
}
- End of the Post ->

Zgodovina sprememb…

  • spremenil: Ciklamen ()

Jean-Paul ::

shm2a:
shmid=shmget(1005, sizeof(20), IPC_CREAT|IPC_EXCL|0600); -> shmid=shmget(1005, 21, IPC_CREAT|IPC_EXCL|0600);

shm2b:
sem_id=semget(1005,1,0600); -> sem_id=semget(1006,1,0600);


Vredno ogleda ...

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

Kako narediti request z "\" v URL-ju

Oddelek: Programiranje
171993 (1268) Horejšio
»

Niti - segmentation fault

Oddelek: Programiranje
211838 (685) galu
»

[C] Sinhronizacija procesov

Oddelek: Programiranje
71023 (896) Cvenemir
»

skupni pomnilnik &#169; linux

Oddelek: Programiranje
62389 (2235) Keki
»

Problem pri uporabi niti (threade) C++

Oddelek: Programiranje
10958 (813) rabbit-zek

Več podobnih tem