Semop() verändert mein SHM. Hilfe!

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Semop() verändert mein SHM. Hilfe!
Bin gerade bei der Aufgabe 8 und halb am verzweifeln.

Mein Verbraucher macht eine OP auf der Semaphore, und danach ist der wert des Lesezeigers im SHM anders. Davor 0, danach 694349243 (oder so ;-))

Wie kann dass denn bitte sein?


mehr input bitte


Okay, ich hab noch so eine blöde Fehlermeldung beim compilieren, vielleicht hängts zusammen (hmm, verdammt, ich glaub das hängt sogar sicher zusammen…)

cc shm.o -o shm
/usr/lib/gcc-lib/i486-suse-linux/3.3/…/…/…/crt1.o(.text.0x18): In function ‘_start’:
: undefined reference to ‘main’
collect2: ld returned 1 exit status
make: *** [shm] Fehler 1

Also klappt wohl irgendwas mit dem verlinken oder so nicht.
im makefile kompilier ich erst die sem.c und shm.c mit -c zu objectfiles, und dann den erzeuger&verbraucher zusammen mit den objects zu den ausführbaren Dateien.

Achja, meine Semaphoren haben mit den Zeigern des Ringpuffers nix zu tun, die sind nur zur leer/voll steuerung und zur koordinierung des Zugriffs da…


cc shm.o -o shm

Was soll diese Zeile bewirken?

Du versuchst aus shm.c (wurde ja vorher sicher irgendwann mal zu einem shm.o compiliert) ein ausführbares Programm zu machen.
In der shm.c sind aber nur ein paar Prozeduren drin und es fehlt die main(). Darum sagt der Compiler (eigentlich der Linker), er kann keine Main finden und somit auch kein Programm erstellen. Du erstellst aus der shm.c und der sem.c erstmal nur Obeject Dateien (*.o). Beim compilieren des erzeuger / verbraucher werden die dann mit angegeben:

shm.o: shm.c
gcc -Wall -pedantic -D_XOPEN_SOURCE -c shm.c

erzeuger: erzeuger.c sem.o shm.o
gcc -Wall -pedantic -D_XOPEN_SOURCE erzeuger.c sem.o shm.o -o erzeuger
[…]


@ robert: da sieht man mal wieder, wer noch nie ein makefile geschrieben hat kopfeinzieh :smiley: :smiley: :smiley:


.PHONY: all install clean
COMPILE  = gcc -g -ansi -pedantic-errors -D_XOPEN_SOURCE=500 -Wall -Werror
TARGET1  = erzeuger
TARGET2  = verbraucher


all: $(TARGET1) $(TARGET2) shm.o sem.o

sem.o: sem.c
	$(COMPILE) -c -o sem.o sem.c

shm.o: shm.c
	$(COMPILE) -c -o sem.o shm.c

erzeuger: $(TARGET1).c shm.o sem.o
	$(COMPILE) -o $(TARGET1) shm.o sem.o $(TARGET1).c

verbraucher: $(TARGET2).c shm.o sem.o
	$(COMPILE) -o $(TARGET2) shm.o sem.o $(TARGET2).c

Also wieso klappt diese Makefile nicht?


wieso denn -c -o, ich würde da nur -c machen, das erstellt dir doch dein objekt-file und mehr willst du ja nicht!
also quasi …

$(COMPILE) -c shm.c

In der letzten Zeile wär shm.o wohl besser als sem.o