Линук Длопен систем у Ц

Linuk Dlopen Sistem U C



Библиотечка функција длопен() је веома корисна функција у језику Ц. Функција учитава библиотеку у меморију након отварања нове. Обично га користимо за учитавање симбола библиотеке који су непознати у време компајлирања. Длопен() је функција која се користи у нашим програмима. ДЛ библиотека имплементира длопен(), дефинисан у Длфцн.х. За функцију длопен потребна су два параметра: назив датотеке библиотеке и ознака. Име датотеке је динамичка библиотека и дефинише да ли се зависности библиотеке израчунавају одмах или не. Функција длопен() враћа „ручицу“ коју треба посматрати као непрозирну вредност и друге операције ДЛ библиотеке то користе. Ако је покушај учитавања неуспешан, длопен() враћа НУЛЛ. Али длопен() враћа исту ручицу датотеке ако учита исту библиотеку много пута.

Док користи функцију длопен, компајлер не испитује потенцијалне грешке јер није свестан типова и прототипова које користимо. Примена длопен функције за стандардно учитавање изгледа да није промовисана од стране ње, осим у неколико мањих ситуација. Успут, то је приступ за побољшање интроспекције. Када дељени модул тренутно користи други програм, оптимизација распореда меморије није посебно заинтересована за условно учитавање. Меморијски отисак се не повећава када се учита претходно коришћена библиотека. Избегавање праћења компајлера је опасно и омогућава добро писање грешака. Поред тога, недостаје нам могућа оптимизација компајлера.

Пример 1:

Сада, размотрите следећи пример да видите функционалност длопен функције у језику Ц. У првом кораку учитавамо неке Ц стандардне библиотеке. Овде учитавамо нову библиотеку “длфцн.х” која се користи за дефинисање макроа док се конструише аргумент длопен режима.







Затим уводимо другу библиотеку унутар нашег програма „гну/либ-наме.х“. Кориснички програми проналазе датотеке заједничке библиотеке укључене у ГНУ либц према макроима које дефинише. ГНУ Ц библиотека нуди основне библиотеке за ГНУ и ГНУ/Линук оперативне системе, као и широк спектар других система заснованих на Линуку. Након тога, имамо имплементацију главног метода. Унутар тога, објекат показивача декларишемо „хандле“ са кључном речи воид. Декларишемо функцију показивача синуса која има тип података доубле. Постоји још једна декларација објекта показивача „грешка“ за руковање грешкама.



Након тога, позивамо функцију длопен унутар објекта „хандле“. Длопен узима два аргумента: ЛИБМ_СО и „РТЛД_ЛАЗИ“. Овде је „ЛИБМ_СО“ назив датотеке библиотеке која обезбеђује математичке функције као што су тригонометријске функције. Ова заједничка библиотека је потребна јер користимо синусну функцију. „РТЛД_ЛАЗИ“ је још један аргумент који позива функцију длопен. Када се дати симбол референцира први пут, премештања се морају извршити у време које одређује имплементација.



Пошто процес можда неће референцирати сваки симбол у извршној објектној датотеци, навођење РТЛД ЛАЗИ би требало да побољша перформансе на имплементацијама које омогућавају динамичко везивање симбола. Затим имамо услов ако-елсе за руковање грешкама када објекат ручке не успе да изврши функцију длопен. Позивамо длеррор да обришемо грешку.





Функција длеррор() обезбеђује стринг са нулом који је читљив и специфицира извештавање о недавној грешци коју је проузроковао позив једног од длопен АПИ позива од последњег позива длеррор. Затим пребацујемо функцију овако: „(*воид**)(&сине)= длсим(хандле, син)“. Пошто је ово чудно, пребацивање је у складу са ИСО Ц чиме се избегавају упозорења компајлера. Користимо функцију длсим која добија путању симбола који је специфициран унутар модула динамичке везе којем се може приступити преко функције длопен().

Такође, поново изводимо иф-елсе операцију за стандардну грешку која се генерише када длеррор() није НУЛЛ. Затим имамо принтф наредбу у којој наводимо вредност синуса коју треба израчунати. У последњем кораку затварамо тај дељени објекат позивањем длцлосе за ручку коју враћа длопен().



#инцлуде <стдио.х>
#инцлуде <стдлиб.х>
#инцлуде <длфцн.х>
#инцлуде <гну/либ-намес.х>

инт
главни ( инт аргц , цхар ** аргв )
{
празнина * ручка ;
дупло ( * њихов ) ( дупло ) ;
цхар * грешка ;

ручка = длопен ( ЛИБМ_СО , РТЛД_ЛАЗИ ) ;
ако ( ! ручка ) {
фпринтф ( стдерр , „%с ' , длеррор ( ) ) ;
излаз ( ЕКСИТ_ФАИЛУРЕ ) ;
}
длеррор ( ) ;

* ( празнина ** ) ( & њихов ) = длсим ( ручка , 'без' ) ;

ако ( ( грешка = длеррор ( ) ) != НУЛА ) {
фпринтф ( стдерр , „%с ' , грешка ) ;
излаз ( ЕКСИТ_ФАИЛУРЕ ) ;
}

принтф ( „%ф ' , ( * њихов ) ( 4.0 ) ) ;
длцлосе ( ручка ) ;
излаз ( ЕКСИТ_СУЦЦЕСС ) ;
}

Користимо опцију -лдл са командом за компилацију Ц пошто је ово библиотека за длопен повезани интерфејс и неопходна је. Када се изврши извршавање длопен датотеке, она приказује вредност синуса претходно дате вредности.

Пример 2:

Сада ћемо узети још један пример коришћења функције длопен. Учитавамо наш програм са свим потребним Ц библиотекама за имплементацију длопен кода. Затим покрећемо наш програм унутар главног метода. Овде дефинишемо стринг са декларацијом променљиве “срц”. Затим декларишемо променљиве показивача „стрлен“, „хандле“ и „еррор“.

Затим позивамо променљиву ручке и примењујемо функцију длопен. Функција длопен уноси заједничку библиотеку „либстр.со“ за функције руковања стринговима и заставицу „РТЛД_ЛАЗИ“ која је већ демонстрирана у претходном примеру. Позивамо функцију длеррор унутар променљиве „еррор“ да обришемо грешку коју генерише функција длопен. Ако-елсе се користи за испитивање грешака.

Затим добијамо адресу стрлен функције помоћу функције длсим и проверавамо грешке док то радимо. После овога, користимо функцију принтф да позовемо функцију стрнлен да вратимо дужину датог низа. На крају затварамо заједничку библиотеку са функцијом длцлосе.

#инцлуде <стдио.х>
#инцлуде <стдлиб.х>
#инцлуде <длфцн.х>
#инцлуде <гну/либ-намес.х>
инт главни ( празнина )
{
цхар * срц = 'Здраво Линук' ;
инт ( * стрлен ) ( конст цхар * ) ;
празнина * ручка ;
цхар * грешка ;


ручка = длопен ( './либстр.со' , РТЛД_ЛАЗИ ) ;
грешка = длеррор ( ) ;
ако ( ! ручка || грешка != НУЛА ) { принтф ( „Покушај учитавања библиотеке није успео! ' , грешка ) ;
повратак - 1 ; }

стрлен = длсим ( ручка , 'стрлен' ) ;
грешка = длеррор ( ) ;
ако ( ! стрлен || грешка == НУЛА ) { принтф ( „%с ' , грешка ) ; повратак - 1 ; }

принтф ( „Дужина низа је:%д ' , стрлен ( срц ) ) ;
длцлосе ( ручка ) ;
повратак 0 ;
}

За извршење датог програма користимо следећу команду. Овде се заставица -лстр користи за функцију дужине низа, а лдл се користи за датотеку библиотеке длопен. Преведени програм даје дужину стринга као што је приказано у љусци:

Закључак

Информације о длопен функцији језика Ц су дате у овом чланку. Имамо кратак увод у функцију длопен. Затим смо имплементирали два примера. Функција враћа идентификатор који дефинише отворену библиотеку. Адресе функција унутар отворене библиотеке се затим одређују помоћу овог идентификатора и функције длсим. Адреса функције у оквиру библиотеке која је већ отворена помоћу длопен-а може се пронаћи помоћу функције длсим.