Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Dogmeat

Stran: [1] 2
1
Nakonec to přes ten symlink funguje, díky

2
Z toho wiki jsem vyčetl, že pokud chci trvale nastavit proměnnou prostředí, musím ji přidat do /etc/environment, ale už se tam nepíše vůbec jakým způsobem.
Našel jsem jednu možnost přidání:
export PATH=$PATH:$HOME/cesta/mojeapp/

takže ji potom vyzkouším, jestli funguje.

Ještě by to i tak chtělo příkaz na odebrání oné cesty při odstraňování balíčku.

3
Aplikace se mi instaluje do /opt/ adresáře, jelikož s sebou táhne další soubory a je strukturována podobně jako na Windows systémech při instalaci do Program Files. V podstatě by mi stačilo nějak přidat do PATH proměnné i onu cestu do /opt/mojeapp a mělo by to fungovat.

4
Zdravím,

mám vytvořený deb balíček pro vlastní aplikaci a potřeboval bych ji přidat mezi proměnné prostředí všem uživatelům tak, aby nebylo potřeba terminál pokaždé nastavit na adresář s danou aplikací a zadávat "./app", ale aby stačilo zadat čistě jen název aplikace ke spuštění, čili například "app". Také bych pak tuto cestu chtěl odstranit při případné odinstalaci balíčku.

Jak to provedu? (předpokládám nastavení v postinst skriptu)

Díky

5
Problém už jsem vyřešil, bylo potřeba po select ověřit socket na chybu pomocí getsockopt(), nyní již vše funguje.

6
Zdravím,

mám problém s následujícím zdrojákem, který má za úkol navázet spojení za pomoci neblokovacího režimu (v IPv6). Problém nastává u select, kdy je vždy vrácena hodnota větší než 0, i když daná adresa v síti vůbec není nebo na ní nic nenaslouchá na připojení.
Díky za rady.

Kód: [Vybrat]
for(ptr=result; ptr != NULL; ptr=ptr->ai_next)
      {

            sock_client = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
            if(sock_client == -1)
            {
                  chyba();
            }

            nastaveni_soc = fcntl(sock_client, F_GETFL, 0);
            if(fcntl(sock_client, F_SETFL, nastaveni_soc | O_NONBLOCK) == -1)
            {
                  chyba();
            }
      
            FD_ZERO(&sada);
            FD_SET(sock_client, &sada);
      
            timeout.tv_sec = 5;
            timeout.tv_usec = 0;
      
            i = connect(sock_client, ptr->ai_addr, (int)ptr->ai_addrlen);
      
            if(i == 0)
            {
                  if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
                  {
                        chyba();
                  }
                      continue;
            }

            if(i < 0)
            {
                  if(errno != EINPROGRESS)
                  {
                        if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
                        {
                              chyba();
                        }
                        break;
                  }
            
            }
            
            i = select(sock_client + 1, NULL, &sada, NULL, &timeout);
            if(i < 0)
            {
                  if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
                  {
                        chyba();
                  }
                  continue;
            }

            if(i == 0)
            {
                  cout <<  "Trying again";
            }
            if(i > 0)
            {
                  cout << ....
            }

            if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
            {
                  chyba();
            }

            break;
      }

7
Vyřešeno,

multicast je dán adresou a není třeba použít setsockopt(), čili hotovo.

8
Nakonec jsem se posunul o něco vpřed, ale stále mi dělá problém správně nastavit socket na parametry, co potřebuji.

Rozlišení IP jsem udělal za pomoci getaddrinfo() a funguje bez problémů.

Podařilo se mi i úspěšně vyzkoušet multicast na IPv4 a taktéž vypadá, že funguje.

U IPv6 už vím, že musím použít multicast k odeslání do spárvného subnetu, ovšem nevím, jak ho mám nastavit. Konfigurace setsockopt(..., SO_MULTICAST, ..) se sice na internetu objevuje, ovšem u mě není podle kompilátoru deklarována a nepodařilo se mi najít, kde se nachází (která hlavičková knihovna ji obsahuje). Na žádnou jinou chybu jsem zatím nenarazil.
Momenálně mám IPv6 ve stavu, kdy neobsahuje vůbec setsockopt(), pouze konstrukce:

sap6.sin6_family = AF_INET6;
inet_pton( AF_INET6, multicast, (void *)&sap6.sin6_addr.s6_addr);
sap6.sin6_port = htons(port);

a následně hned sendto()

Jak doplním ono nastavení multicastu, aby vše správně fungovalo?

Díky

9
Abych upřesnil můj problém:

Mám aplikaci, která bere jako vstup MAC adresu a masku podsítě (nebo broadcast).

Pro odeslání magického packetu je potřeba vytvořit socket, aby bylo možné odeslat tento packet pomocí sendto() a k tomu je potřeba jej nastavit buď na AF_INET pro IPv4 nebo pro AF_INET6 pro IPv6 - to není problém.

Ten nastává u nastavení socketu setsockopt(), ve kterém se u IPv4 socketu nastavuje SO_BROADCAST (nenašel jsem jakýkoli jiný příklad nastavení a nemám prozatím možnost ověřit, zda takto lze opravdu poslat Wake on LAN na multicast či unicast).

V IPv6 ovšem nelze použít SO_BROADCAST, protokol toto nastavení neobsahuje a nepodařilo se mi najít, co použít místo něj. Nějaké tipy? Materiálů kolem této problematiky je jako šafránu.

Dále bych potřeboval nějak rozlišit, zda byla vložena maska IPv6 či IPv4 sítě, abych mohl vytvořit ten správný socket - jak na to v c++?

Možná mi něco uniká :-)
Díky za tipy

10
Zdravím,

mám vytvořenou aplikaci v c++, která mi dělá WOL v IPv4 a chtěl bych, aby fungovala i v IPv6 sítích, ale nemůžu o tom najít v podstatě žádné informace, natož nějaký příklad.

Neví někdo, kde bych se o tom daly zjistit nějaké informace nebo jak to provést?

Díky

11
Díky, při chvilce vyzkouším a snad to poběží  :)

12

Ideální by pro mne bylo mít více těchto knihoven v systému. Ovšem jak je do něj dostanu - respektive odkud je nejlepší je stáhnout a jak je nainstalovat tak, aby zůstaly i původní knihovny?
A jak je poté předám kompileru, aby je úspěšně použil?

Nikdy jsem nic takového nedělal a google není moc nápomocný v této oblasti  :)

13
Zdravím,

po nějaké době jsem zde opět s jedním problémem, se kterým bych potřeboval poradit.

Kompiluji aplikaci pod Ubuntu 8.04 a narazil jsem na problém, že takto zkompilovaná aplikace mi odmítá běžet na starším debianu, jelikož je vytvořená pomocí novějšího gcc a glibc. Lze nějakým použitelným způsobem zkompilovat mou aplikaci pro tento starší glibc i na nějaké novější distirbuci Ubuntu (a případně i jiné distribuci s novějším glibc)?

Ideální by bylo, pokud by byla schopna běžet na všech podporovaných distribucích (tzn. podporovaných verzích Debianu, Red Hatu, prostě pro tu nejstarší podporovanou verzi glibc).

Díky za tipy  :)

14
Moc díky, přesně něco takového jsem potřeboval  ;)

15
Pro logování do souboru jsem nakonec použil onen log4cpp (Standartní fprintf mi bohužel neposkytne jednoduše dostatek funkcí a možností pro logování, které potřebuji).

Na ten trace jsem se díval, ale potřeboval bych více informací než je schopen poskytnout. Ještě jej vyzkouším a uvidím, co dokáže.

Ohledně toho DUMP souboru jsem asi moc náročný (nic jako ve Visual Studiu, které mi vyplivne přímo řádek, kde došlo k problému nejspíš nenajdu obávám se). Ve své aplikaci využívám velké množství vláken a je poměrně obtížné ji ladit. Navíc jsem se u ní setkal s problémem, že na jednom systému funguje bez problému a na jiném docházelo k náhodným pádům - proto ty DUMP soubory

Ještě bych se rád zeptal, jestli zde někdo neví o nějakém odkazu, který by poskytnul dobré informace ohledně debuggování.
Zatím jsem přišel jen na -ulimit a výsledek poté protáhnout gdb, ale nic moc srozumitelného a podrobného ohledně použití a jak z něj poté dostat, kde ve zdrojovém souboru je přesně problém (předtím jsem využíval k tvorbě SW hlavně ono Visual Studio)

Díky

16
Zdravím,

měl bych dotaz ohledně logování. V současné době má aplikace (c++) využívá k logování informací a chyb pouze:
openlog();
syslog();
closelog();

Rád bych ji dále rozšířil volitelně o logování do souboru (nejlépe pod všemi dostupnými distribucemi) a chtěl bych se zeptat, jaký by jste mi doporučili způsob či knihovnu. Zatím jsem našel jen jednu zajímavou a jednoduše použitelnou knihovnu a to "log4cpp".

Dále bych rád přidal možnost vytvořit nějaký použitelný dump při pádu aplikace. Tady se mi zatím nepodařilo najít žádnou knihovnu, která by byla použitelná pod více distribucemi zároveň.

Díky za tipy

17
Příkazový řádek a programování pro GNU/Linux / System() a vlákna
« kdy: 29 Listopadu 2009, 22:32:22 »
Zdravím,

google mi nebyl schopen poradit, tak se obracím na zde přítomné.
Potřeboval bych vědět, zda je volání system(""); v c++ aplikaci takzvaně thread-safe. Používám jej v mém programu k mnohonásobnému spuštění ping na různé IP adresy.

Pokud tomu tak není, čím jej mám nahradit, aby aplikace neztratila na rychlosti? Předpokládám, že použití semaforu by program podstatně zpomalilo.

Předem díky za odpověď

18
Zatím se mi povedlo realizovat vyvolání varování pomocí:
system("zenity --....");

se zobrazením na display 0, ale tato možnost funguje jen v Ubuntu 9.xx, ve starší 8.04 nedojde k zobrazení žádného varování a nenásleduje ani žádná chybová zpráva.

Zkusím možnost spuštění přes ten xterm a uvidím, co se stane.

19
Vyřešeno, bylo nutné rozdělit skript na dva, kdy první provede:

`pkg-config --cflags glib-2.0`

a v následujícím u linkeru proběhne:

`pkg-config --libs glib-2.0`

z nějakého důvodu byl při kompilaci kompletní příkaz ignorován:

`pkg-config --cflags --libs glib-2.0`

20
Zdravím,

tak jsem zde s dalším dotazem.
Snažím se zkompilovat aplikaci (vlastní), využívající hlavičkového souboru glib.h. Potřebné knihovny libglib2.0-dev jsou nainstalované.

Vložen je takto:
#include <glib.h>

Skript z makefile vypadá takto:

${CC} `pkg-config --cflags --libs glib-2.0` ${OBJ} -o hello

kdy:
CC - g++
OBJ - main.o

Pokud spustím `pkg-config --cflags --libs glib-2.0` zvlášť v konzoli, dostanu nazpět správné umístění souborů přesně podle manuálových stránek:

http://library.gnome.org/devel/glib/2.16/glib-compiling.html

Skript pro kompilaci je funkční pokud nepoužiji glib knihovny.

Má někdo nějaký nápad, kde by mohl být problém?

21
Snažím se vyvolat jeho spuštění z vlastního daemona napsaného v C++

Vím jak spustit skript či aplikaci z windows služby, ale u linuxového daemona se mi zatím nepovedlo nalézt žádné řešení.

22
Nakonec vyřešeno za pomocí:

setutent();
getutent(); v cyklu
endutent();

23
Zdravím,

řeším další problém týkající se spuštění skriptu (se Zenity) z daemona tak, aby byl jeho výstup zobrazený uživateli.

Prosté zavolání system("./skript"); (volání je správné, v něm chyba není jelikož z normální aplikace funguje) nemá žádný efekt, nic se nestane.

Díky za každou radu

24
Zkoumal jsem možnost použití "who" a vypadá to zajímavě a použitelně. Podařilo se mi úspěšně zavolat jej v normální aplikaci a poté vypsat přijatý výsledek do konzole. Narazil jsem ovšem na problém, jak dále zpracovat tento výsledek od:

int prom = system("who -u");
cout << prom;

V prom se totiž nalézá při vytištění na konzoli kompletní výsledek (a ne hodnota typu int, dojde k vytištění řetězce) a já potřebuji nějakým způsobem ověřit, co přesně vrátila a ne ji tisknout (například zda je NULL nebo zda je počet zjištěných uživatelů roven nule).
Pátral jsem po googlu a nepodařilo se mi narazit na nic, co by popisovalo návratové hodnoty od takto použitého who (nebo spíše system()) a jak je zpracovat.

Díky za každou radu.

25
Já mám za to, že daemon běží i pokud není nikdo přihlášený na přihlašovací obrazovce, s čímž počítám při tvorbě mé aplikace  :)

A právě z toho důvodu hledám nějaký způsob, jak zjistit, zda je nějaký uživatel přihlášený či zda je systém na logon obrazovce.

Stran: [1] 2

Provoz zaštiťuje spolek OpenAlt.