Autor Wątek: Scieżke uruchomionego programu  (Przeczytany 7489 razy)

Offline Kajtek

  • Użytkownik
    • Mimikra.pl - Najlepsza Agencja Interaktywna

# Wrzesień 03, 2007, 22:43:54
W jaki sposób zdobyć ścieżkę do uruchomionego programu? Argument main args[] nie wchodzi w grę. Z góry dziękuję za odpowiedź.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline krajew4

  • Użytkownik

# Wrzesień 03, 2007, 22:51:14
GetCommandLine()? :P

Offline Kajtek

  • Użytkownik
    • Mimikra.pl - Najlepsza Agencja Interaktywna

# Wrzesień 03, 2007, 22:54:46
A pod Linuksem?

Offline Mattrick

  • Użytkownik

# Wrzesień 03, 2007, 23:20:42
Komendą Linuxową 'pwd'. Jak ją wywołasz, od ciebie zależy.

Offline Kajtek

  • Użytkownik
    • Mimikra.pl - Najlepsza Agencja Interaktywna

# Wrzesień 03, 2007, 23:23:36
No właśnie w tym jest cały problem. Bo ta zmienna środowiskowa kiedy program jest odpalany z Xów (KDE) zawiera zawsze mój katalog domowy (/home/kajtek). Jak odpalam program przez konsolę, wtedy jest prawidłowo. Mi jednak zależy na możliwości włączenia mojego programiku przez kliknięcie.

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 03, 2007, 23:29:02
pwd zwraca katalog bieżący, niekoniecznie ten, który zawiera kod programu...

Możesz spróbować z /proc: /proc/PID/cmndline jest plikiem zawierającym linię wywołania procesu PID, a /proc/PID/exe jest linkiem symbolicznym do jego kodu (binarki).

Offline Kajtek

  • Użytkownik
    • Mimikra.pl - Najlepsza Agencja Interaktywna

# Wrzesień 03, 2007, 23:39:54
Spróbuję jutro i już napiszę. No problem jest taki, jak próbuję cokolwiek wczytać w programie np:
LoadImage("button.png") ; To on go nie szuka w katalogu z binarką/kodem, tylko właśnie w /home/kajtek.;/

bies

  • Gość
# Wrzesień 03, 2007, 23:51:14
/proc/PID/cmdline == argv[0]. /proc/PID/exe -- to zadziała, ale użytkownik musi mieć dostęp do /proc. Ale ogólnie to chyba lepiej używać ścieżek bezwględnych (ustawianych przez --prefix w autotools) i ew. zmiennych środowiskowych.
« Ostatnia zmiana: Wrzesień 03, 2007, 23:57:15 wysłana przez bies »

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Wrzesień 04, 2007, 00:04:57
To jedno z często zadawanych pytań i dlatego trafiło do Unix Programming FAQ:
http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC23

W skrócie: Lepiej tego nie robić, a pliki trzymać w jakiś lokalizacjach (typu katalog domowy użytkownika czy też /etc/cośtam) lub korzystać z katalogu roboczego, z którym został uruchomiony program.

Jeśli już musisz, to w Windows API jest do tego funkcja GetModuleFileName (jeśli dobrze pamiętam nazwę).

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Wrzesień 04, 2007, 04:50:17
W skrócie: Lepiej tego nie robić, a pliki trzymać w jakiś lokalizacjach (typu katalog domowy użytkownika czy też /etc/cośtam) lub korzystać z katalogu roboczego, z którym został uruchomiony program.
Problem tylko z plikami danych, których nie tworzymy sami, a są dostarczone razem z aplikacją. :)

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 04, 2007, 09:12:36
Zgadzam się z Reg, że lepiej tego tak nie robić..
Właśnie pliki dostarczone z aplikacją powinny być trzymane w takich katalogach: w /etc (albo np. /usr/local/etc) pliki konfiguracyjne, tzn takie, w których Użytkownik bedzie sobie zazwyczaj grzebał, a np. w /usr/share (albo /usr/local/share) pliki z danymi nie przeznaczonymi zazwyczaj do modyfikacji przez Użytkownika, takimi jak np Twoje obrazki.

Takim dość standardowym postępowaniem byłoby umieszczenie w Makefile'u czegoś w rodzaju:
INSTALL_PREFIX=/usr/local


BIN_DIR=$(INSTALL_PREFIX)/bin
DATA_DIR=$(INSTALL_PREFIX)/share/moje_dane
CONFIG_DIR=$(INSTALL_PREFIX)/etc

CFLAGS=-DDATA_DIR=\"$(DATA_DIR)\" -DCONFIG_DIR=\"$(CONFIG_DIR)\" bla, bla, bla inne flagi

#....

install: all
         cp binarka_mojego_programu $(BIN_DIR)
         cp katalog_z_danymi_w_źródłach/* $(DATA_DIR)
         cp przykładowy_plik_konfiguracyjny $(CONFIG_DIR)


Wtedy we wszystkich plikach z Twoim kodem są zdefiniowane symbole preprocesora DATA_DIR i CONFIG_DIR, rozwijające się do odpowiednich łańcuchów. (Czyli robiłbyś LoadImage(DATA_DIR "/obrazek.png") na przykład).

A “make install” przeniosłoby wszystkie pliki w odpowiednie miejsce, nawet jeśli Użytkownik zmieniłby sobie prefiks na coś egzotycznego w stylu /opt/games

Offline Kajtek

  • Użytkownik
    • Mimikra.pl - Najlepsza Agencja Interaktywna

# Wrzesień 04, 2007, 17:39:08
Dzięki. Rozważę to z umieszczaniem plików w stałych miejscach takich jak /usr/local/share itd.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Wrzesień 04, 2007, 19:23:18
Takim dość standardowym postępowaniem byłoby umieszczenie w Makefile'u czegoś w rodzaju:
A co w przypadku, gdy nie ma makefile'a, a jest tylko tar.gz z binarkami? :)

Offline Kuba®'79™

  • Użytkownik

# Wrzesień 04, 2007, 20:53:06
A co w przypadku, gdy nie ma makefile'a, a jest tylko tar.gz z binarkami? :)

Hmmm... Gdybym faktycznie robił coś takiego, to chyba faktycznie trzymałbym binarkę w jednym katalogu z danymi i zakładałbym w programie, że ten katalog jest bieżący. Kazałbym użytkownikowi rozpakować całość tam, gdzie mu wygodnie, i odpalić wewnątrz tego katalogu jako root jakieś install.sh w rodzaju:
#!/bin/sh

INSTALL_DIR=/usr/local/bin


PROGRAM_DIR=`pwd`
PROGRAM="$INSTALL_DIR/program"

echo "#!/bin/sh" > $PROGRAM
echo "cd $PROGRAM_DIR" >> $PROGRAM
echo "./program-bin" >> $PROGRAM                # zakładam, że program-bin to nazwa mojej binarki

chmod 755 $PROGRAM

I wtedy mój programik będzie odpalany normalnie poleceniem “program”, ale poprzez skrypt, który najpierw ustawi mu odpowiednio katalog bieżacy, tak, żeby nie miał kłopotów z odnalezieniem swoich plików.

Offline Xion

  • Redaktor
    • xion.log

# Wrzesień 04, 2007, 21:29:09
O ile mi wiadomo ustawienia programów w Linuxie zapisuje się najczęściej w katalogu domowym usera, tworząc w nim podkatalog z nazwą zaczynającą się od kropki, np .bash .