Linux - poslání události – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Linux - poslání události – C / C++ – Fórum – Programujte.comLinux - poslání události – C / C++ – Fórum – Programujte.com

 

29. 12. 2016   #1
-
0
-

Zdravím,

jedná se o problém v Linuxu, ale nenašel jsem lepší forum.

Mám spuštěnou aplikaci A a potřeboval bych tuto aplikaci A informovat, že byla spuštěna jiná aplikace B.

Zkoušel jsem to pomocí FIFO "named pipe". 

V aplikaci A čekám ve vlákně až druhá aplikace B vytvoří FIFO. (aplikace B se spustí později)

while (1)
{
	int fd = open("myfifo", O_RDONLY | O_NONBLOCK | O_SYNC, 0666);
	if (fd == -1)
	{
		if (errno != 2)
		{
			std::exit(0);
			return 0;
		}
	}
	else
	{
		std::exit(0);
		return 0;
	}
}

Druhá aplikace B pouze vytvoří FIFO a skončí.

mkfifo("myfifo", 0666);

Aplikace B FIFO vytvoří, to je OK.

Ale problém je, že aplikace A toto vytvořené FIFO nevidí.

Respektive vidí, ale až aplikaci A restartuji.

To znamená, že aplikaci A ukončím a potom znovu spustím a teprve potom uvidí vytvořenou FIFO.

Já potřebuji aby aplikace A viděla FIFO hned jak byla FIFO vytvořená aplikací B.

Máte někdo nějaké nápady?

Děkuji.

Nahlásit jako SPAM
IP: 94.112.170.–
gna
~ Anonymní uživatel
1883 příspěvků
30. 12. 2016   #2
-
0
-

Toto samo o sobě je v pohodě (až na to, že ten fd nezavřeš).

Co znamená, že ho "nevidí" ?

Nahlásit jako SPAM
IP: 213.211.51.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #3
-
0
-

#2 gna

To znamená, že funkce open v aplikaci A pořád vrací -1 a errno je nastaveno na 2(ENOENT)

#define ENOENT 2 /* No such file or directory */

A to přesto, že aplikace B FIFO určitě vytvořila.

Když aplikaci A ukončím a hned znovu spustím tak už FIFO vidí. Funkce open skončí úspěšně.

Nechápu proč musím prvně aplikaci A ukončit a potom znovu spustit aby FIFO viděla.

Možná to dělám zbytečně složitě, ale v Linuxu běžně nepracuji.

Potřebuji jenom běžící aplikaci A sdělit, že byla spuštěná jiná aplikace B.

Nahlásit jako SPAM
IP: 94.112.170.–
KIIV
~ Moderátor
+43
God of flame
30. 12. 2016   #4
-
+1
-
Zajímavé

#3 jurin2jurin
Proc radeji neposles signal? Kdyz pouzijes jeste signalfd, tak ani nehrozi ruzne problemy, co zpracovani signal handleru obvykle prinasi (Jako treba ze kdyz prijdou dva naraz, tak se prerusi zpracovani aktualniho programu, zacne se zpracovavat prvni signal a ten se pak muze taky prerusit a zacit zpracovavat ten druhej. Super deadlock, pokud nejakej idiot pouzije mutex v handleru).

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #5
-
0
-

#4 KIIV
To už jsem taky zkoušel, ale asi dělám něco špatně.

V aplikaci A jsem registroval signal handler.

signal(SIGINT, signalHandler);  

void signalHandler( int inSignum )
{
   exit(inSignum);  
}

A aplikace B po svým spuštění pouze pošle signal.

kill(PID aplikace A, SIGINT);
 

Ale signalHandler v aplikaci A se mi nikdy nezavolá.

PID aplikace A zjištím funkcí getpid.

Toto zjištěné PID aplikace A zapíše do souboru a aplikace B si ho z tohoto souboru přečte a zavolá kill.

Nahlásit jako SPAM
IP: 94.112.170.–
KIIV
~ Moderátor
+43
God of flame
30. 12. 2016   #6
-
0
-

#5 jurin2jurin
Posilej radeji SIGHUP nebo SIGUSR1 ci SIGUSR2.

Ale ano, tak se to obvykle dela i u sluzeb (HUP je obvykle pouzit pro reload konfigurace).

Jen teda musi aplikace bezet.

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #7
-
0
-

#6 KIIV
Tak jsem to znovu zkusil a volání funkce kill z aplikace B mi selže.

errno je nastaveno na 3 (ESRCH). Jakoby aplikace A vůbec neexistovala.

Přitom když si nechám aplikací A vypsat všechny procesy do logu, tak tam aplikace A je a PID taky sedí.

Ale když si v procesu B nechám vypsat všechy procesy, tak tam aplikaci A nevidím.

Prostě proces B vůbec "nevidí" běžící aplikaci A. Proč???

Nahlásit jako SPAM
IP: 94.112.170.–
KIIV
~ Moderátor
+43
God of flame
30. 12. 2016   #8
-
0
-

#7 jurin2jurin
hod sem radsi kompletni kod, co k tomu pouzivas. A spoustis to vubec pod stejnym uzivatelem?

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
30. 12. 2016   #9
-
0
-

Pod jakým uživatelským účtem je spuštěna A, pod jakým uživatelským účtem je spuštěna B?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #10
-
0
-

Zařízení kde Linux běží je Lego kostka EV3.

Je to zařízení připojené USB kabelem k počítači a běží tam Linux.

Já jenom můžu aplikaci vytvořit a pak mám příkazy jak aplikaci do EV3 kostky nahrát a spustit.

Ale pod jakým uživatelem se spustí to fakt nevím. Navíc Linux neznám.

Nahlásit jako SPAM
IP: 94.112.170.–
30. 12. 2016   #11
-
0
-

takže dva počítače propojené přes USB. Jeden (asi ta kostka EV3) jako podřízený. Zde je otázka, zda EV3 není k PC připojena přes virtuální COM. Pak by aplikace mohly mezi sebou komunikovat přes tento COM.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #12
-
0
-

#11 hlucheucho
Ale mě obě aplikace běží na EV3 kostce.

U mě na počítači běží jenom prostředí z kterého můžu EV3 kostku částečně ovládat.

Tedy nahrát soubory do EV3 kostky nebo stáhnout soubory z EV3 kostky a spuštět aplikace v EV3 kostce.

Nahlásit jako SPAM
IP: 94.112.170.–
30. 12. 2016   #13
-
0
-

Takže dvě aplikace na jednom počítači? Obě jsi vytvořil a instaloval?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
30. 12. 2016   #14
-
0
-

Zkusil bych ty aplikace spustit pod systémovým účtem a hledal bych ekvivalent windowsovského "spustit jako správce".

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #15
-
0
-

#13 hlucheucho
Vytvořil ano, ale instaloval je silné slovo.

U sebe na počítači vytvořím binárky obou aplikací A i B. (C++ a GCC překladač).

Nahraju je do EV3 kostky.

Spustím aplikaci A.

Později spustím aplikaci B a potřebuji nějak dát aplikaci A vědět, že byla spuštěna aplikace B.

Nahlásit jako SPAM
IP: 94.112.170.–
30. 12. 2016   #16
-
0
-

Ona to B nemusí na sebe "prásknout", A si může zjišťovat, zda B je mezi běžícími procesy. Gůůůglil bych něco jako "Linux Get Process by Name". Dále bych se podíval na možnosti IPC v Linuxu.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #17
-
0
-

#16 hlucheucho
Ty procesy už jsem zkoušel, ale aplikace A prostě "nevidí" že aplikace B běží.

IPC vyzkouším.

Díky.

Nahlásit jako SPAM
IP: 94.112.170.–
30. 12. 2016   #18
-
0
-

S pomocí soketů lze vytvořit plnohodnotnou IPC např. takto: A se bude chovat jako server, vytvoří naslouchací soket. B se jako klient připojuje k A. V okamžiku obdržení žádosti o připojení A ví, že B běží. Po akceptování této žádosti je otevřen soket kterým mohou A a B navzájem komunikovat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #19
-
0
-

#18 hlucheucho
Nevím co je IPC, ale zkoušel jsem klasické sokety.

Funkce socket, bind, listen, connect,... ale to mi nefungovalo.

Aplikace A byla server a čekala na připojení.

Když aplikace B zavolala connect, tak to selhalo na "Connection refused".

Asi proto, že EV3 kostka není připojený v síti.

Nahlásit jako SPAM
IP: 94.112.170.–
30. 12. 2016   #20
-
0
-

IPC je zkratka "Inter Process Communication". Sokety jdou i lokálně. Další metody IPC jsou pipes (roury), shared memory, jdou použít i soubory....  Takže např. aplikace B vytvoří soubor a zapíše do něj datum a čas. Aplikace A se pokouší soubor otevřít. Každý neúspěch znamená, že aplikace B "neodvedla svou práci". Po úspěšném otevření souboru aplikace A soubor přečte a smaže.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
30. 12. 2016   #21
-
0
-

#20 hlucheucho
To už jsem všechno zkoušel a nic mi nefunguje.

Soubory i pipe.

Aplikace A když běží, tak tyto objekty(soubory, pipe) vytvořené aplikací B nevidí.

Až když aplikaci A ukončím a znovu spustím, teprve potom to vidí. To už jsem psal na začátku.

Nahlásit jako SPAM
IP: 94.112.170.–
30. 12. 2016   #22
-
0
-

Jestli zkusíš fopen jen po spuštění aplikace A, pak není divu, že neví o souboru, který vzniknul až dlouho po jejím spuštění. To se dá vyřešit tak, že v aplikaci A poběží časovač a při jeho tiknutí se pokusíš soubor otevřít. Pokud se soubor podaří otevřít, aplikace B ho vytvořila, zapsala a uzavřela. V takovém případě zastavíš časovač, soubor přečteš a smažeš. Na intervalu časovače pak závisí latence. Čím delší perioda, tím větší latence a současně menší spotřeba strojového času na testování existence souboru.

U soketů se funkce nevrací hned, ale až po přijetí žádosti o připojení, přečtení požadovaného počtu bytů .... Fakticky tak zablokují vlákno, ve kterém pracují. To může vést k zamrznutí aplikace. Lze zvolit "neblokující" režim, ale pak je nutné se pravidelně dotazovat na události na soketech. Podobně to může být i u jiných mechanizmů IPC.

Pokud aplikaci nenaprogramuješ aby si průběžně zjišťovala stav ve svém okolí, sama od sebe to neudělá.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
31. 12. 2016   #23
-
0
-

#22 hlucheucho
U aplikace A vytvořím nové vlákno a v tomto vlákně se ve smyčce pokouším pořád dokola otevřít soubor, který vytvořila aplikace B. Ve smyčce mám sleep 500 ms aby toto vlákno tak moc nevytěžovalo hlavní vlákno aplikace A. A toto mi nefunguje. Aplikace B soubor vytvořila, ale aplikace A ho v tom svým vlákně nevidí.

Až když aplikaci A zastavím a znovu spustím, tak teprve potom soubor uvidí.

Jinak tady zdroják co sem použil když jsem zkoušel sockety

Aplikace A:

int main()
{
	pthread_t threadId = 0;
	if (pthread_create(&threadId, 0, Thread_Fce_Exit, 0) != 0)
		return 0;

	return EV3_main();
} 

void* Thread_Fce_Exit(void* lpVoid)
{
	WriteLog("Thread_Fce_Exit - Start");

	int mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (mainSocket < 0)
	{
		WriteLog("Error - create socket");
		return 0;
	}
	WriteLog("1(%d)", mainSocket);

	sockaddr_in sockName;
	sockName.sin_family = AF_INET;
	sockName.sin_port = htons(1616);
	sockName.sin_addr.s_addr = INADDR_ANY;

	if (bind(mainSocket, (sockaddr*)&sockName, sizeof(sockName)) < 0)
	{
		WriteLog("Error - bind socket");
		return 0;
	}
	WriteLog("2");

	if (listen(mainSocket, 10) < 0)
	{
		WriteLog("Error - listen socket");
		return 0;
	}
	WriteLog("3");

	while (1)
	{
		sockaddr_in clientInfo;
		socklen_t addrlen = 0;
		WriteLog("4");
		int clientSocket = accept(mainSocket, (sockaddr*)&clientInfo, &addrlen);
		if (clientSocket < 0)
		{
			WriteLog("Error - accept(%d)", errno);
			return 0;
		}

		break;
	}

	std::exit(0);
	return 0;
}

Aplikace B, která se spouští později než A. 

int main()
{
	WriteLog("cpp4robots_kill - Start");

	hostent* host = gethostbyname("127.0.0.1");
	if (host == 0)
	{
		WriteLog("Error - gethostbyname");
		return 0;
	}
	WriteLog("1");

	int mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (mainSocket < 0)
	{
		WriteLog("Error - create socket");
		return 0;
	}
	WriteLog("2");

	sockaddr_in serverSock;
	serverSock.sin_family = AF_INET;
	serverSock.sin_port = htons(1616);
	memcpy(&(serverSock.sin_addr), host->h_addr, host->h_length);

	if (connect(mainSocket, (sockaddr*)&serverSock, sizeof(serverSock)) < 0)
	{
		WriteLog("Error - connect(%d)", errno);
		return 0;
	}

	WriteLog("cpp4robots_kill - End");
	return 0;
} 

Tady mi aplikace B vždy selže na funkci connect.

errno je po volání connect nastaveno na 111 (ECONNREFUSED - Connection refused)

Pokud by jsi věděl, jak ty sockety udělat lokálně, asi by to bylo nejlepší řešení pro mě.

Díky.

Nahlásit jako SPAM
IP: 94.112.170.–
gna
~ Anonymní uživatel
1883 příspěvků
1. 1. 2017   #24
-
0
-

Kód máš správně. Problém bude v té kostce.

Ten první pokus s FIFO vůbec nechápu. Jak jsi mohl dojít k ENOENT, když to čekající vlákno v takovém případě neskončí?

Ale to už je jedno. Jak to popisuješ, tak mi to připadá, že ti ty procesy neběží současně. Respektive A se při spuštění B ukončí (nebo zasekne). Jak to spouštíš? Dostaneš na tom normálně shell?

Nahlásit jako SPAM
IP: 213.211.51.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
1. 1. 2017   #25
-
0
-

#24 gna
Procesy A i B běží současně. Oba mi vytváří logy s časem a podle toho poznám, že běží současně.

Spouštím je tak, že pošlu po USB kabelu zprávu(příkaz) do EV3 kostky s názvem souboru, který se má spustit.

Shell bohužel nedostanu.

Jak už jsem psal, můžu EV3 kostku ovládat pouze pomocí zpráv, které tam posílám.

Můžu nahrát soubor do kostky, stáhnout soubor z kostky, smazat soubor v kostce nebo spustit soubor v kostce.

Nahlásit jako SPAM
IP: 94.112.170.–
2. 1. 2017   #26
-
0
-

Porovnal jsem tvůj kód s http://www.builder.cz/rubriky/c/c--/tcp-server-v-linuxu-156219cz  a nejsem si jistý, zda u serveru používáš správně funkci accept. Použití cyklu while(1) je mi záhadou. Funkce accept je blokovací, pokud není žádost o připojení, mělo by na ní vlákno zastavit a až při přijetí žádosti o připojení by mělo dojít k jejímu návratu, po kterém se podmíněně vypíše log a cyklus je "násilně" ukončen voláním return nebo je při nesplněné podmínce ukončen voláním break. Zřejmě je while zbytečné a prostá podmínka by stačila. Bylo by vhodné si chování vlákna odkrokovat v debuggeru.

Podle http://serverfault.com/questions/725262/what-causes-the-connection-refused-message tebou uvedená chyba znamená že buď na portu nikdo nenaslouchá nebo je port blokován Firewallem. Možná bych zkusil ještě jiný port, např můj oblíbený 1234. Ještě bych si ověřil existenci síťového rozhraní, musí alespoň podporovat "localhost".

Dále bych se zajímal o OS - asi se bude jednat o specifický derivát Linuxu. Snažil bych se získat jeho dokumentaci nebo alespoň informace o tom, co to umí a co ošidili.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
19. 2. 2017   #27
-
0
-

Zdravím,

po delší době jsem se opět vrátil k tomuto problému.

Zjistil jsem, že můžu používat Linux příkazy, tak jsem v obou aplikacích spustil příkaz ps na vypsání běžících procesů a výstup jsem přesměroval do souboru a tady je výsledek.

Aplikace A:

Připojen obrázek.

Aplikace B:

Připojen obrázek.

Aplikace A je HelloWorld.

Aplikace B je cpp4robots_kill2.

Otázka je proč aplikace B nevypíše i PID 1207 a 1208.

Když aplikace B dělá výpis běžících procesů, tak aplikace A určitě běží.


Připojen obrázek.

Nahlásit jako SPAM
IP: 94.112.170.–
Staon0
Návštěvník
21. 2. 2017   #28
-
0
-

#27 jurin2jurin
Můžu si oči vyočit, ale nikde nevidím, že by oba procesy běžely najednou. Napadají mě dvě možnosti:

  1. navzdory vaším tvrzením současně neběží,
  2. každý běží v jiném terminálu a ps nebylo spuštěné tak, aby vypisovalo všechno. Já osobně pro tento účel používám ps axu, ale na Linuxu je obecně více preferované ps -ef.

Anebo jako workaround by šlo situaci otočit. Podle vašeho popisu se aplikace A chová jako server, takže dává lepší smysl, aby si pojmenovanou rouru vytvořila ona a B si ji pouze otevřelo.

Nahlásit jako SPAM
IP: 94.142.234.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
22. 2. 2017   #29
-
0
-

#28 Staon
Procesy běží určitě najednou. Aplikaci A můžu ukončit pouze ručně a pořád v cyklu mi vypisuje něco na display kostky. Když spouštím aplikaci B, tak aplikace A pořád vypisuje na display.

Neznám Linux, takže nevím co znamená, že každý proces běží v jiném terminálu.

Díval jsem se na parametry příkazu ps, ale když použiji ps aux nebo ps -ef nebo cokoliv jiného tak mi to do výstupu napíše, že tyto parametry nezná. Jediný parametr který mi projde je -w.

Zkoušel jsem i z aplikace B spustit příkaz kill s PID aplikace A.

Napíše mi to chybu, že takové PID neexistuje.

Co se týká FIFO zkoušel jsem i postup jaký popisuješ. Aplikace A vytvoří rouru, aplikace B si ji potom otevře a zapíše do ní. To funguje, ale aplikace A vůbec nevidí data, která tam aplikace B zapsala. Takže v aplikaci A nepoznám, že aplikace B už něco zapsala.

Pořád mi to připadá, že nemám dostačné práva na tyto akce.

Ale Linux neznám, tak nevím jak zjistit jaká mám práva.

Nahlásit jako SPAM
IP: 84.242.99.–
Staon0
Návštěvník
22. 2. 2017   #30
-
0
-

#29 jurin2jurin
Podle výpisu z ps spouštíte aplikace pod uživatelem root, tedy s právy problém nebude.

Abych to shrnul. Podle vás nefunguje ani roura, ani signály, ani TCP sockety. Pravděpodobnost, že nějaký Linux neumí ani jedno, je prakticky nulová. Takže bych hledal chybu na vaší straně.

Utilita kill vám říká, že PID neexistuje, takže tvrzení, že proces A určitě běží, se zdá být s největší pravděpodobností chybné. Netuším jakou z popisovaných variant momentálně zkoušíte. Ale vaše první ukázka kódu měla vadu, že proces A skončil ihned poté, co se aplikace B spustila (ihned po prvním úspěšném otevření roury, funkce exit ukončuje celý proces, ne jen vlákno). Jste si jistý, že tam něco takového nemáte?

Osobně bych vám doporučoval si komunikaci mezi procesy nejdříve odladit na "normálním" Linuxu, a pak ji zkoušet přenést na kostku.

Víc už vám tady asi nikdo neporadí, pokud nezveřejníte celý kód. Momentálně se motáme pořád dokola a už ani nevím, kterou variantu vlastně momentálně zkoušíte.

Nahlásit jako SPAM
IP: 94.142.234.–
jurin2jurin
~ Anonymní uživatel
15 příspěvků
22. 2. 2017   #31
-
0
-

#30 Staon
Ale vaše první ukázka kódu měla vadu, že proces A skončil ihned poté, co se aplikace B spustila (ihned po prvním úspěšném otevření roury, funkce exit ukončuje celý proces, ne jen vlákno). Jste si jistý, že tam něco takového nemáte?

Ale to je přesně to co bych potřeboval. Bohužel to nefunguje a aplikace A se neukončí, protože funkce exit se nikdy nezavolá. Funkce open vždy skončí s chybou -1 a errno je nastaveno na hodnotu 2.

Toto jsem zjistil:

Pustím aplikaci A, která vypisuje pořád něco na display. Aplikace A si vytvoří další vlákno ve kterém čeká až bude vytvořená roura "myfifo". Až bude tato roura vytvořená aplikace A se ukončí.

Pustím aplikaci B, která vytvoří rouru "myfifo" a skončí.

Aplikace A na to bohužel nereaguje a proto aplikaci A ukončím ručně (na kostce zmáčknu tlačítko Esc a na to aplikace A reaguje tak, že se ukončí)

Znovu spouštím aplikaci A, která se ihned ukončí protože už najednou vidí vytvořenou rouru "myfifo".

Proč tu rouru nevidí hned, proč musím nejdřívé aplikaci A ukončit a potom znovu spustit aby rouru viděl?

Nahlásit jako SPAM
IP: 84.242.99.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Poslani emailu — založil Jirka

Poslání příkazu na USB — založil Romanx

Poslání dat do vlákna — založil eximik

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý