linux programistiiiiiiiiiiiiiii

8 отговора 210 прегледа
#1

linux programistiiiiiiiiiiiiiii

imam 2 vaprosa:

1. kak moga da razbera palnia pat, ot koito e startiran izpalnim file (argv[0] ne varshi rabota)

2. pri binarno chetene na file, kak moga da razbera dali EOF e EOF ili greshka pri chetene

Отговор
в отговор на Xypodilec #2

Отг: linux programistiiiiiiiiiiiiiii

1. Za kakvo tochno ti e tozi put? Izpolzvai relativni putishta ako ti trqbva neshto.
V argv[0] ti e purviq argument na programata!


2. Izpolzvai fstat za da vidish kakuv e razmera na fail-a, sled tova fread.

Tova e za C!

Uspeh

Отговор
в отговор на Дизeлджия #3

blagodaria za (2.)

1. Palnia pat mi trabva zaradi slednoto: po vreme na rabotata na programata iskam da pisha info vav file v subpath na patia na izpalnimia file. argv[0] sadarja imeto, kakto e izvikano ot shell-a i (tova go proverih :(( ) ako patia e slojen v $PATH ... siibalomamata, zashtoto ako zadam rezultatnia file da e bez pat ili s "./" go pishe v tekushtata, koiato na vsichkoto otgore (po opredelenie) moje da se razlichava v razlichnite OS, a te mnogo stanaha kato broika (mamka im i na tiah).
...
Ta, zatova mi e palnia pat. Ako imash madra idea shte e super (vij P.S. po-dolu)

2. Mnogo mersi za fstat - tochno tova ne mojah da nameria i se zachudih za toia EOF.

P.S. poneje razpolagam samo s man-ovete niama kak da tarsia kak bi mogla da se kazva funkcia, koiato pravi kakvoto mi triabva


Отговор
в отговор на Xypodilec #4

Отг: blagodaria za (2.)

Setih se :)))
Tvoqta funkciaq e getwd(), vij i getcwd()

Uspeh

Отговор
в отговор на Xypodilec #5

Отг: blagodaria za (2.)

Vizh sega. Ideata da pishesh v dir ot koiato e startirana programata protivorechi na ideologiata v Unix/Linux.
Ne che ne mozhe no ne e prieto :))
Ako programata ti e instalirana v /usr/local/bin primerno logichno e da pishesh (i chetesh danni) v /usr/local/var i da si chetesh konfiguraciite ot /usr/local/etc

Drug i to dosta logichen variant e da si instalirash programata v /usr/local/neshto_si
koeto neshto_si si ima neshto_si/etc neshto_si/var neshto_si/bin

100% si puskal ./configure
E standartno ima enda opcia
--prefix=PREFIX
Tochno tova se ima predvid

Отговор
в отговор на Дизeлджия #6

Отг: blagodaria za (2.)

Абе, ако програмката я има в PATH няма да стане с getwd(), защото тя връща текущата директория, а тя може да е различна.


Има една команда на shell - which <par1> <par2> ...,
която проверява параметрите дали ги има в PATH и отпечатва пълния
път, ако ги намери.

Та, можеш да пуснеш тази команда с arg[0] и ако тя ти върне "no <par1> in blabla"
значи взимаш argv[0] релативно към текущата директория.
Разбира се първо проверяваш дали argv[0] не започва с '/', което означава, че е стартирана с пълен път.
Ако пък which ти върне нещо друго, то това е пътя на командата, но той пак може да бъде релативен, но това не е проблем- имаш getwc() за да вземеш текущата директория.

Айде успех,


P.S. това за идеологията по-долу е хубаво да се следва, но пък не е задължително, зависи какво си написал.

Отговор
в отговор на Xypodilec #7

Отг: linux programistiiiiiiiiiiiiiii

Blagodaria na vsichki za savetite!!!!! Za sajalenie me podhvanaha edni problemi s administriraneto na MySQL i zatova se zabavih s otgovora, a i skoro mai niama da imam vreme da za vaprosnata programa, no sas sigurnost shte post-na rezultat ;)

Отговор
в отговор на Xypodilec #8

Отг: linux programistiiiiiiiiiiiiiii

Ако имаш монтирана procfs, то /proc/pid/exe е символна връзка към изпълнимия файл.
"pid" е резултата от getpid(2).


Отговор
в отговор на Xypodilec #9

Отг: linux programistiiiiiiiiiiiiiii



// Returns the directory where the executable file resides
// The full name of the executable is pointed by a symbolic link
// /proc/<pid>/exe
// Caller must free the returned string
char * Win::get_bin_dir()
{
// Construct the name of the symbolic link
unsigned pid = getpid();
char link_name[30];
ostrstream s(link_name, 30);
s << "/proc/" << pid << "/exe" << '\0';

// Read where the link points
char * exe = new char[200];
int len = readlink(link_name, exe, 200);
if(len == -1) return 0;

// Cut out the program name (we need the directory)
char * p = exe + len;
while(*p != '/') p--;
// Preserve '/' in path
p++;
*p = 0;

return exe;
} //End of get_bin_dir


Отговор