Anonymní profil jurin2jurin – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil jurin2jurin – Programujte.comAnonymní profil jurin2jurin – Programujte.com

 

Příspěvky odeslané z IP adresy 94.112.170.–

jurin2jurin
C / C++ › Linux - poslání události
19. 2. 2017   #214936

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.

jurin2jurin
C / C++ › Linux - poslání události
1. 1. 2017   #214330

#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.

jurin2jurin
C / C++ › Linux - poslání události
31. 12. 2016   #214324

#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.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214316

#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.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214314

#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.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214312

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

IPC vyzkouším.

Díky.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214310

#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.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214307

#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.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214305

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.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214301

#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č???

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214296

#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.

jurin2jurin
C / C++ › Linux - poslání události
30. 12. 2016   #214292

#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.

C / C++ › Linux - poslání události
29. 12. 2016   #214280

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.

 

 

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