Portál AbcLinuxu, 26. dubna 2024 07:21


Dotaz: shared memory - shmat() -> Invalid argument

8.10.2006 20:23 Filip Jirsák | skóre: 68 | blog: Fa & Bi
shared memory - shmat() -> Invalid argument
Přečteno: 500×
Odpovědět | Admin
Po překladu a spuštění následujícího C kódu dostávám chybu "Error: Invalid argument". Tu samou chybu dostanu i pokud je ukazatel na str zarovnaný.
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdio.h>

int main(void) {
	int id = shmget(10789L, 10, IPC_CREAT | 0777);
	char str[] = "abcdefghi";
	char* addr = (char*) shmat(id, str, SHM_RND);
	if ((long)addr == -1) {
		printf("Error: %s\n", strerror(errno));
		return 1;
	}
	return 0;
}
Přitom pokud nechci mapovat existující oblast paměti, ale novou oblast, kód funguje:
	char* addr = (char*) shmat(id, 0, SHM_RND);
Přiznávám se rovnou, že programování v C není zrovna moje hobby a do tohohle jsem se pustil jenom proto, že jsem doufal, že napsat těch 10 řádek nebude problém… Podle man shmat by ten kód měl být IMHO vpořádku, asi přehlížím nějakou triviální chybu – dokáže mi někdo poradit, jak na to?
uname -a
Linux 2.6.16-gentoo-r7 #2 PREEMPT Fri May 26 18:27:12 CEST 2006 i686 AMD Athlon(tm) XP 2600+ GNU/Linux
ls -l /usr/lib/libglib.so
lrwxrwxrwx 1 root root 21 Feb  3  2005 /usr/lib/libglib.so -> libglib-1.2.so.0.0.10
Podotýkám, že potřebuji takto nasdílet již "existující" blok paměti. Výsledek má být zakomponován do JNI a Javy a potřebuji takhle komunikovat s již existujícím sw, který používá právě sdílenou paměť, takže jiný způsob IPC nemůžu použít.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 8.10.2006 20:27 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: shared memory - shmat() -> Invalid argument
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nechápu, co by to mělo znamenat, když tam dáte ten str. Mapovat sdílenou paměť přes existující paměť mi připadá nesmyslné.
8.10.2006 21:08 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: shared memory - shmat() -> Invalid argument
Chápal jsem to tak, že ten str tímhle způsobem nasdílím. Že by v tom byl zakopaný hafan?

Ona adresa, kam se bude sdílená paměť mapovat, tedy vždy znamená, že tam sdílená paměť vznikne? A pokud chci začít sdílet již existující data, musím je do sdílené paměti nakopírovat?

Ono je to vlastně logické, protože shmat už neví nic o tom, že jsem před chvílí přes shmget sdílenou paměť vytvořil, a kdybych se pokusil s tou mojí logikou namapovat na existující adresu sdílenou paměť vytvořenouněkým jiným, měl bych najednou dva kandidáty na obsah sdílené paměti – obsah, který tam vytvořil jiný program (a který se sdílí), a obsah, který je uložen na zadané adrese v adresním prostoru mého programu. A to by asi nešlo.

Takže ano, adresa předávaná fci shmat je dobrá jenom k tomu, pokud mám speciální přání, kam do mého adresního prostoru se má sdílená paměť namapovat, ale sdílet již přidělenou paměť takhle nemůžu.

Díky za nakopnutí správným směrem :-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.