சி இல் லினக்ஸ் டிலோபன் சிஸ்டம்

Ci Il Linaks Tilopan Cistam



நூலக செயல்பாடு dlopen() என்பது சி மொழியில் மிகவும் பயனுள்ள செயல்பாடாகும். செயல்பாடு புதிய ஒன்றைத் திறந்த பிறகு நூலகத்தை நினைவகத்தில் ஏற்றுகிறது. தொகுக்கும் நேரத்தில் தெரியாத நூலக சின்னங்களை ஏற்றுவதற்கு பொதுவாக இதைப் பயன்படுத்துகிறோம். Dlopen() என்பது எங்கள் நிரல்களில் பயன்படுத்தப்படும் ஒரு செயல்பாடு. DL நூலகம் dlopen(), Dlfcn.h இல் வரையறுக்கப்பட்டுள்ளது. dlopen செயல்பாட்டிற்கு இரண்டு அளவுருக்கள் தேவை: நூலகக் கோப்பின் பெயர் மற்றும் கொடி. கோப்பின் பெயர் டைனமிக் லைப்ரரி ஆகும், மேலும் நூலகத்தின் சார்புகள் இப்போதே கணக்கிடப்படுகிறதா இல்லையா என்பதை இது வரையறுக்கிறது. dlopen() ஒரு ஒளிபுகா மதிப்பாகக் கருதப்பட வேண்டிய 'கைப்பிடியை' வழங்குகிறது மற்றும் பிற DL நூலக செயல்பாடுகள் இதைப் பயன்படுத்துகின்றன. ஏற்றுவதற்கான முயற்சி தோல்வியுற்றால், dlopen() NULL ஐ வழங்கும். ஆனால் dlopen() ஆனது ஒரே லைப்ரரியை பல முறை ஏற்றினால் அதே கோப்பு கைப்பிடியை திருப்பி தரும்.

dlopen செயல்பாட்டைப் பயன்படுத்தும் போது, ​​கம்பைலர் நாம் பயன்படுத்தும் வகைகள் மற்றும் முன்மாதிரிகளை அறியாததால் சாத்தியமான பிழைகளை ஆய்வு செய்யாது. ஒரு சில சிறிய சூழ்நிலைகளைத் தவிர, நிலையான ஏற்றுதலுக்கான dlopen செயல்பாட்டின் வரிசைப்படுத்தல் அது விளம்பரப்படுத்தப்பட்டதாகத் தெரியவில்லை. மூலம், இது உள்நோக்கத்தை மேம்படுத்துவதற்கான ஒரு அணுகுமுறை. பகிரப்பட்ட தொகுதி தற்போது மற்றொரு நிரலால் பயன்படுத்தப்படும் போது, ​​நினைவக தளவமைப்பு மேம்படுத்தல் நிபந்தனை ஏற்றுதலில் குறிப்பாக ஆர்வமாக இல்லை. முன்பு பயன்படுத்தப்பட்ட நூலகம் ஏற்றப்படும் போது நினைவக தடம் அதிகரிக்காது. கம்பைலர் கண்காணிப்பைத் தவிர்ப்பது ஆபத்தானது மற்றும் நல்ல பிழை எழுதுவதற்கு உதவுகிறது. கூடுதலாக, எங்களிடம் சாத்தியமான கம்பைலர் ஆப்டிமைசேஷன் இல்லை.

எடுத்துக்காட்டு 1:

இப்போது, ​​C மொழியில் dlopen செயல்பாட்டின் செயல்பாட்டைக் காண பின்வரும் உதாரணத்தைக் கவனியுங்கள். முதல் கட்டத்தில், சில C தரநிலை நூலகங்களை ஏற்றுவோம். இங்கே, dlopen பயன்முறை வாதத்தை உருவாக்கும்போது மேக்ரோக்களை வரையறுக்கப் பயன்படும் புதிய நூலகமான “dlfcn.h” ஐ ஏற்றுகிறோம்.







பின்னர், எங்கள் நிரலான “gnu/lib-name.h” இன் உள்ளே மற்றொரு நூலகத்தை அறிமுகப்படுத்துகிறோம். GNU libc உடன் சேர்க்கப்பட்டுள்ள பகிரப்பட்ட நூலகக் கோப்புகள், அது வரையறுக்கும் மேக்ரோக்களின் படி பயனர் நிரல்களால் கண்டறியப்படுகின்றன. GNU C நூலகம், GNU மற்றும் GNU/Linux இயங்குதளங்களுக்கான அடிப்படை நூலகங்கள் மற்றும் பிற லினக்ஸ் அடிப்படையிலான அமைப்புகளின் பரந்த வரம்பை வழங்குகிறது. அதன் பிறகு, முக்கிய முறை செயல்படுத்தல் உள்ளது. அதன் உள்ளே, 'கைப்பிடி' என்ற சுட்டிக்காட்டி பொருளை வெற்றிடமான முக்கிய வார்த்தையுடன் அறிவிக்கிறோம். தரவு வகை இரட்டையைக் கொண்ட ஒரு சுட்டி சைன் செயல்பாட்டை நாங்கள் அறிவிக்கிறோம். பிழை கையாளுதலுக்கான சுட்டிக்காட்டி பொருளின் மற்றொரு அறிவிப்பு 'பிழை' உள்ளது.



அதன் பிறகு, 'கைப்பிடி' பொருளின் உள்ளே dlopen செயல்பாட்டை செயல்படுத்துகிறோம். dlopen இரண்டு வாதங்களை எடுக்கும்: LIBM_SO மற்றும் “RTLD_LAZY”. இங்கே, 'LIBM_SO' என்பது முக்கோணவியல் செயல்பாடுகள் போன்ற கணித செயல்பாடுகளை வழங்கும் நூலக கோப்பின் பெயர். நாம் சைன் செயல்பாட்டைப் பயன்படுத்துவதால் இந்தப் பகிரப்பட்ட நூலகம் தேவைப்படுகிறது. 'RTLD_LAZY' என்பது dlopen செயல்பாட்டை அழைக்கும் மற்றொரு வாதமாகும். கொடுக்கப்பட்ட சின்னம் முதன்முறையாகக் குறிப்பிடப்படும்போது, ​​செயல்படுத்துவதன் மூலம் நிர்ணயிக்கப்பட்ட நேரத்தில் இடமாற்றங்கள் மேற்கொள்ளப்பட வேண்டும்.



இயங்கக்கூடிய பொருள் கோப்பில் உள்ள ஒவ்வொரு குறியீட்டையும் ஒரு செயல்முறை குறிப்பிடாமல் போகலாம் என்பதால், RTLD LAZY ஐக் குறிப்பிடுவது டைனமிக் சிம்பல் பிணைப்பை செயல்படுத்தும் செயலாக்கங்களில் செயல்திறனை மேம்படுத்த வேண்டும். அடுத்து, ஹேண்டில் ஆப்ஜெக்ட் dlopen செயல்பாட்டைச் செய்யத் தவறினால் பிழையைக் கையாள்வதற்கான if-else நிபந்தனை உள்ளது. பிழையை அழிக்க dlerror ஐ அழைக்கிறோம்.





dlerror() செயல்பாடு மனிதனால் படிக்கக்கூடிய பூஜ்ய-முடிக்கப்பட்ட சரத்தை வழங்குகிறது மற்றும் கடைசி dlerror அழைப்பிலிருந்து dlopen API அழைப்புகளில் ஒன்றின் அழைப்பால் ஏற்பட்ட சமீபத்திய பிழையின் அறிக்கையைக் குறிப்பிடுகிறது. பின்னர், நாங்கள் செயல்பாட்டை இப்படி அனுப்புகிறோம்: '(* void**)(&sine)= dlsym(கைப்பிடி, பாவம்)'. இது விசித்திரமாக இருப்பதால், வார்ப்பு ISO C உடன் இணங்குகிறது, இது கம்பைலரின் எச்சரிக்கைகளைத் தவிர்க்கிறது. dlopen() செயல்பாட்டின் மூலம் அணுகக்கூடிய டைனமிக் இணைப்பு தொகுதிக்குள் குறிப்பிடப்பட்ட ஒரு குறியீட்டின் பாதையைப் பெறும் dlsym செயல்பாட்டை நாங்கள் பயன்படுத்துகிறோம்.

மேலும், dlerror() NULL ஆக இல்லாதபோது ஏற்படும் நிலையான பிழைக்காக if-else செயல்பாட்டை மீண்டும் செய்கிறோம். பின்னர், எங்களிடம் ஒரு printf அறிக்கை உள்ளது, அங்கு நாம் கணக்கிடப்பட வேண்டிய சைன் மதிப்பைக் குறிப்பிடுகிறோம். கடைசி கட்டத்தில், dlopen() மூலம் திரும்பிய கைப்பிடிக்கு dlclose ஐ அழைப்பதன் மூலம் அந்த பகிரப்பட்ட பொருளை மூடுகிறோம்.



# அடங்கும்
#உள்படுத்து
#அடங்கும்
# அடங்கும்

முழு எண்ணாக
முக்கிய ( முழு எண்ணாக argc , கரி ** argv )
{
வெற்றிடமானது * கைப்பிடி ;
இரட்டை ( * அவர்களுடையது ) ( இரட்டை ) ;
கரி * பிழை ;

கைப்பிடி = dlopen ( LIBM_SO , RTLD_LAZY ) ;
என்றால் ( ! கைப்பிடி ) {
fprintf ( stderr , '%s \n ' , dlerror ( ) ) ;
வெளியேறு ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( வெற்றிடமானது ** ) ( & அவர்களுடையது ) = dlsym ( கைப்பிடி , 'இல்லாமல்' ) ;

என்றால் ( ( பிழை = dlerror ( ) ) != ஏதுமில்லை ) {
fprintf ( stderr , '%s \n ' , பிழை ) ;
வெளியேறு ( EXIT_FAILURE ) ;
}

printf ( '%f \n ' , ( * அவர்களுடையது ) ( 4.0 ) ) ;
dlclose ( கைப்பிடி ) ;
வெளியேறு ( EXIT_SUCCESS ) ;
}

dlopen இணைக்கப்பட்ட இடைமுகத்திற்கான நூலகம் இது என்பதால், C தொகுத்தல் கட்டளையுடன் -ldl விருப்பத்தைப் பயன்படுத்துகிறோம். dlopen கோப்பு செயல்படுத்தப்படும் போது, ​​அது முன்னர் கொடுக்கப்பட்ட மதிப்பின் சைன் மதிப்பைக் காட்டுகிறது.

எடுத்துக்காட்டு 2:

இப்போது, ​​dlopen செயல்பாட்டைப் பயன்படுத்துவதற்கான மற்றொரு உதாரணத்தை எடுத்துக்கொள்வோம். dlopen குறியீட்டை செயல்படுத்த தேவையான அனைத்து C நூலகங்களுடனும் எங்கள் நிரலை ஏற்றுகிறோம். பின்னர், நாங்கள் எங்கள் திட்டத்தை பிரதான முறையில் தொடங்குகிறோம். இங்கே, 'src' மாறியின் அறிவிப்புடன் சரத்தை வரையறுக்கிறோம். நாம் சுட்டிக்காட்டி மாறிகள் 'strlen', 'கைப்பிடி' மற்றும் 'பிழை' என்று அறிவிக்கிறோம்.

அடுத்து, கைப்பிடி மாறியை அழைக்கிறோம் மற்றும் dlopen செயல்பாட்டை வரிசைப்படுத்துகிறோம். dlopen செயல்பாடு சரம் கையாளுதல் செயல்பாடுகளுக்காக பகிரப்பட்ட நூலகமான “libstr.so” மற்றும் முந்தைய எடுத்துக்காட்டில் ஏற்கனவே காட்டப்பட்டுள்ள “RTLD_LAZY” கொடியை உள்ளீடு செய்கிறது. dlopen செயல்பாட்டால் உருவாக்கப்பட்ட பிழையை அழிக்க, 'பிழை' மாறிக்குள் dlerror செயல்பாட்டைப் பயன்படுத்துகிறோம். பிழைகளை ஆராய if-else பயன்படுத்தப்படுகிறது.

பின்னர், dlsym செயல்பாட்டைப் பயன்படுத்தி strlen செயல்பாட்டின் முகவரியைப் பெற்று, இதைச் செய்யும்போது பிழைகளைச் சரிபார்ப்போம். இதற்குப் பிறகு, கொடுக்கப்பட்ட சரத்தின் நீளத்தை வழங்க, strnlen செயல்பாட்டை அழைக்க printf செயல்பாட்டைப் பயன்படுத்துகிறோம். முடிவில், dlclose செயல்பாடு மூலம் பகிரப்பட்ட நூலகத்தை மூடுகிறோம்.

# அடங்கும்
#உள்படுத்து
#அடங்கும்
#உள்ளடக்க
முழு எண்ணாக முக்கிய ( வெற்றிடமானது )
{
கரி * src = 'ஹலோ லினக்ஸ்' ;
முழு எண்ணாக ( * strlen ) ( நிலையான கரி * ) ;
வெற்றிடமானது * கைப்பிடி ;
கரி * பிழை ;


கைப்பிடி = dlopen ( './libstr.so' , RTLD_LAZY ) ;
பிழை = dlerror ( ) ;
என்றால் ( ! கைப்பிடி || பிழை != ஏதுமில்லை ) { printf ( 'நூலகத்தை ஏற்றும் முயற்சி தோல்வியடைந்தது! \n %s \n ' , பிழை ) ;
திரும்ப - 1 ; }

strlen = dlsym ( கைப்பிடி , 'strlen' ) ;
பிழை = dlerror ( ) ;
என்றால் ( ! strlen || பிழை == ஏதுமில்லை ) { printf ( '%s \n ' , பிழை ) ; திரும்ப - 1 ; }

printf ( 'சரத்தின் நீளம்:%d \n ' , strlen ( src ) ) ;
dlclose ( கைப்பிடி ) ;
திரும்ப 0 ;
}

கொடுக்கப்பட்ட நிரலின் செயல்பாட்டிற்கு பின்வரும் கட்டளையைப் பயன்படுத்துகிறோம். இங்கே, -lstr கொடி சரம் நீள செயல்பாட்டிற்கு பயன்படுத்தப்படுகிறது மற்றும் ldl dlopen நூலக கோப்பிற்கு பயன்படுத்தப்படுகிறது. தொகுக்கப்பட்ட நிரல் ஷெல்லில் காட்டப்பட்டுள்ளபடி சரத்தின் நீளத்தைக் கொடுக்கிறது:

முடிவுரை

இந்த கட்டுரையில் C மொழியின் dlopen செயல்பாடு தொடர்பான தகவல்கள் வழங்கப்பட்டுள்ளன. dlopen செயல்பாட்டின் சுருக்கமான அறிமுகம் எங்களிடம் உள்ளது. பின்னர், நாங்கள் இரண்டு உதாரணங்களை செயல்படுத்தினோம். செயல்பாடு திறந்த நூலகத்தை வரையறுக்கும் அடையாளங்காட்டியை வழங்குகிறது. திறக்கப்பட்ட நூலகத்தில் உள்ள செயல்பாடுகளின் முகவரிகள் இந்த அடையாளங்காட்டி மற்றும் dlsym செயல்பாட்டைப் பயன்படுத்தி தீர்மானிக்கப்படுகின்றன. dlopen ஐப் பயன்படுத்தி ஏற்கனவே திறக்கப்பட்ட நூலகத்தில் உள்ள ஒரு செயல்பாட்டின் முகவரியை dlsym செயல்பாட்டைப் பயன்படுத்தி காணலாம்.