کتابخانه لینوکس‌

برای برنامه‌نویس لینوکس، چیزی که مهم است، دانستن محل ابزارها و منابع گسترش نرم‌افزار است. در این شماره با نگاهی مختصر، دایرکتوری‌ها و فایل‌های مهم را مرور می‌کنیم.
کد خبر: ۱۹۲۷۱۳

نرم‌افزارهای کاربردی‌

نرم‌افزارهای کاربردی(Application)  داخل دایرکتوری‌هایی قرار می‌گیرند که برایشان رزرو شده است. نرم‌افزارهایی که توسط سیستم و برای کاربردهای عمومی در اختیار قرار می‌گیرند، مثل نرم‌افزارهای گسترش برنامه‌نویسی در دایرکتوری/usr/bin  قرار می‌گیرند. نرم‌افزارهایی که مدیران سیستم برای همان سیستم یا شبکه محلی نصب می‌کنند، داخل دایرکتوریusr/local  یا/opt/  هستند. ادمین‌های لینوکسی، این دو مسیر را به این خاطر ترجیح می‌دهند که می‌توان به سادگی از برنامه‌های سیستمی جدایشان کرد. به این طریق به‌سادگی می‌شود موقع ارتقا هسته سیستم عامل تنها نگران این دو شاخه بود. برای برنامه‌های بزرگ، بهتر است حتما از/usr/local  استفاده شود. اما فعلاً و برای برنامه‌های کوچک ما، کافی است از همان دایرکتوریhome  خودتان استفاده کنید.
برخی از برنامه‌ها و نرم‌افزارهای سیستمی ساختار دایرکتوری خودشان را دارند. شاید بزرگ‌ترین‌شان،X Window System  باشد که معمولادر دایرکتوری /11usr/x یا  /11 usr/bin/x نصب می‌شود.

 gcc (که برای برنامه‌نویسی‌مان ازش استفاده خواهیم کرد) عموماً درusr/bin/  یاusr/local/bin/  واقع شده است. این محل را هنگام کامپایل کردن کامپایلر تعیین می‌کنند. در سیستم‌های لینوکسی، کتابخانه‌های gcc تحت نام شماره نسخه و نام توزیع لینوکس در زیر شاخهusr/lib/gcc/  قرار می‌گیرند. برای مثال، برای من مسیر کتابخانه این‌طور است:  2.4/usr/lib/gcc/i684-linux-gnu/‌است. فایل‌های کتابخانه‌ای و کامپایلر gcc در اینجا قرار می‌گیرند.

فایل‌های سرآیند(Header)

چه برای برنامه‌نویسی C  و چه برای زبان‌های دیگر، به فایل‌های سرآیند برای تعاریف و ثابت‌ها و فراخوانی‌های تابع‌مان نیاز داریم.

در زبانC ، تقریباً همیشه فایل‌های سرآیند را می‌توان داخلusr/include/  و زیرشاخه‌هایش پیدا کرد. معمولا هم می‌شود فایل‌های سرآیند سیستمی و مختص لینوکس را داخلusr/include/sys/  وusr/include/linux/  پیدا کرد.
دیگر برنامه‌ها نیز فایل‌های سرآیند خودشان را دارند که اتوماتیک توسط کامپایلر پیدا می‌شود. مثلاً /11usr/include/X برای X Window System است وusr/include/c++/  برای GNU C++  .

برای این‌که از فایل‌های سرآیند غیراستاندارد یا فایل‌های سرآیندی که خودمان تولید کرده‌ایم در جاهای مختلف استفاده کنیم، کافی است از - I هنگام کامپایل استفاده کنیم I. مخفف Include  است. مثلاً این دستور را ببینید:
 gcc -I/usr/openwin/include ali.c  $
این دستور، به کامپایلر می‌گویدusr/openwin/include/  را مثل دایرکتوری‌های استاندارد برای پیدا کردن فایل‌های سرآیندی که در برنامه ali.c  به‌کار رفته، بگردد.

استفاده از grep  برای پیدا کردن تابع‌ها یا فایل‌های سرآیند، تقریبا به یک عرف تبدیل شده است. فرض را بر این بگذارید که می‌خواهید اسم فایل سرآیندی که وضعیت خروج یک برنامه در آن است را پیدا کنید. بهترین کار، این است که از داخل ترمینال بروید سراغ دایرکتوری/usr/include  و بعد مثلا از عبارتی که ممکن است مد نظر باشد، grep  بگیرید! درست عین مثال زیر:

 grep EXIT- *.h$
خروجی دستور، چیزی شبیه این خواهد بود که شما در صفحه مشاهده می‌کنید.
...
/1define EXIT-FAILUREَstdlib.h:
 Failing exit status. */*
0define EXITSUCCESS َstdlib.h:
/* Successful exit status. */
...
این دستور چه کار می‌کند؟ grep تمام فایل‌هایی که پسوند.h  دارند را می‌گردد تا عبارتEXIT-  را در آن‌ها پیدا کند. در این مثال، نتیجه‌ را می‌بینید که توی فایل stdlib.h  پیدا شده است.

فایل‌های کتابخانه‌ای‌

کتابخانه‌ها همان مجموعه‌ای از توابع از پیش کامپایل شده هستند که به قصد استفاده مجدد نوشته شده‌اند. از میان فایل‌های کتابخانه‌ای می‌توان به روتین‌های دسترسی به دیتابیس یا توابع مرتبط با خروجی نمایشگر اشاره کرد. اما توضیح و بسط این بخش را بگذارید برای بعد.

کتابخانه‌های استاندارد سیستمی معمولا درlib/  و/usr/lib  ذخیره می‌شوند. به کامپایلر C (یا دقیق‌تر بگویم،(linker باید بگوییم که کدام کتابخانه‌ها را بگردد، چون به‌طور پیشفرض فقط کتابخانه‌های استاندارد C  را می‌گردد. هنوز چیزهایی از آن دوران که می‌گفتند کامپیوتر چیز گران‌قیمتی است و هر چرخهCPU  طلاست که تلف می‌شود، باقی مانده است. برای همین، این نکته را به یاد داشته باشید که تنها قراردادن کتابخانه‌های شما در دایرکتوری‌های استاندارد به این معنا نیست که کامپایلر می‌تواند آن‌ها را پیدا کند؛ کتابخانه‌ها بایستی از نام‌گذاری بسیار خاصی پیروی کنند و حتماً در دستور نیز نوشته شوند.

نکته: اسم فایل کتابخانه همیشه با کلمه lib  شروع می‌شود. بعد بخشی که مشخص‌کننده ماهیت کتابخانه است (مثل c  برای کتابخانه C  و یا m  برای کتابخانه ریاضی) و آخرین بخش نام فایل، با نقطه (.) شروع می‌شود و نوع کتابخانه را مشخص می‌کند:

1.a - برای کتابخانه‌های سنتی و استاتیک.

2.so - برای کتابخانه‌های به اشتراک گذاشته شده

کتابخانه‌ها باید به هر دو فرمت استاتیک و اشتراکی وجود داشته باشند و حرف من را می‌توانید با ls گرفتن ازusr/lib/  مشاهده کنید. برای استفاده از یک کتابخانه می‌توانید هم مسیر کاملش را بدهید، یا از - I استفاده کنید. مثلا:
$gcc -o ali ali.c /usr/lib/libm.a

به کامپایلر می‌گوید که فایل ali.c باید فایل اجرایی ali را خروجی بدهد و همچنین از توابع کتابخانه‌ای ریاضی بعلاوه توابع استاندارد برای شناسایی فراخوانی‌های تابع استفاده کند. حالا این را داشته باشید، می‌توان عین همین کار را این‌طور نیز انجام داد:

 gcc -o fred fred.c -1m$
حالا، نشان -1m که بین 1 و m فاصله‌ای وجود ندارد، در واقع مخففی است برای صدا زدن کتابخانه libm.a  حالا ویژگی دیگر این دستور این است که اگر لازم باشد از کتابخانهso  هم استفاده بشود، کامپایلر این را هوشمندانه تشخیص می‌دهد.
هرچند که کتابخانه‌ها معمولا توی جاهای استانداردی یافت می‌شوند، اما اگر خواستید می‌توانید برای دسترسی به کتابخانه‌های خود، ازL)  -L  حتما بزرگ باشد!) برای موقعیت دهی به کامپایلر استفاده کنید. مثلا  این دستور را در نظر بگیرید:
11 gcc -o alix11 -L/usr/openwin/lib alix11.c -1X$
این دستور برنامه‌ای به نام 11 alix را که از کتابخانه 11 libX داخلusr/openwin/lib/  استفاده می‌کند، کامپایل و لینک می‌کند.

کتابخانه‌های ایستا

ساده‌ترین شکل کتابخانه مجموعه‌از فایل‌هاست که به فرم قابل استفاده، کنار همدیگر گذاشته شده‌اند. وقتی برنامه‌ای بخواهد از تابع موجود در کتابخانه استفاده کند، فایل سرآیندی که آن تابع را تعریف کرده‌است، include می‌کند. دیگر کامپایلر و لینکر وظیفه به هم پیوند دادن کدهای کتابخانه با تک فایل اجرایی شما را به عهده می‌گیرند.

کتابخانه‌های ایستا، که به آن آرشیو هم می‌گویند، از قدیم نام‌هایی با پسوندa) .a   حرف اول(archive داشتند. مثلا‌/usr/lib/libc.a.

می‌توانید کتابخانه‌های خاص خودتان را با دستور ar (مخفف (archive  بسازید و توابع را جداگانه با gcc -c  کامپایل کنید. توجه داشته باشید که تا حد ممکن توابع را در سورس فایل‌های مختلف بگذارید.اگر توابع نیازمند دسترسی به داده مشترک بودند، می‌توانید چند تابع را در یک فایل قرار دهید و از متغیر استاتیکی که در همان فایل تعریف کرده‌اید، استفاده کنید.

کتابخانه‌های به اشتراک گذاشته شده‌

یکی از معایب کتابخانه‌های استاتیک این است که وقتی تعداد زیادی برنامه همزمان اجرا می‌شوند و همه‌شان از توابعی از یک کتابخانه استفاده می‌کنند، شما به خود می‌آیید و می‌بینید که تعداد زیادی کپی از یک تابع در حافظه موجود است. این اتفاق منجر به هرز رفتن فضای زیادی از حافظه و دیسک سخت می‌شود.

اکثر سیستم‌های لینوکس و یونیکسی که از کتابخانه‌های به اشتراک‌گذاشته  شده پشتیبانی می‌کنند، دیگر این مشکل را ندارند. این‌که چطور و چگونه همچین کاری انجام می‌شود، فراتر از بحثی است که ما در این حوزه بخواهیم انجام دهیم و کتابی جدا می‌طلبد، برای همین، ما فقط به پیاده‌سازی‌ محسوس آن در لینوکس توجه می‌کنیم و بس.

کتابخانه‌های اشتراکی هم درست کنار کتابخانه‌های ایستا و در همان دایرکتوری ذخیره می‌شوند. اما پسوند کتابخانه‌های اشتراکی چیز دیگری است. وقتی برنامه از یک کتابخانه اشتراکی استفاده می‌کند، طوری لینک می‌شود که شامل خود تابع نمی‌شود، اما رفرنسی از کد اشتراکی موجود در کتابخانه را در خود قرار می‌دهد تا در هنگام اجرا به سراغش برود. برنامه نتیجه اگر در حافظه بار شود و بعد اجرا شود، تابع فراخوانی شده آن صدا زده می‌شود، که اگر آن برنامه، یا برنامه‌های قبلی، به آن نیاز داشته باشند، در اینصورت کتابخانه نیز در حافظه بار می‌شود.

به همین ترتیب، سیستم می‌تواند با یک کپی از کتابخانه اشتراکی به تعداد خیلی زیادی همزمان سرویس بدهد. یکی دیگر از مزایای این روش این است که کتابخانه اشتراکی می‌تواند بدون نیاز به تغییر برنامه‌هایی که از آن استفاده کرده‌اند، مستقلا ارتقا داده شود.

4.2برنامه‌نویسی کنسول‌

یکی از دلایلی که ما برای برنامه‌نویسی ابتدا از پوسته (Shell)  شروع می‌کنیم، این است که به راحتی می‌توان برای پوسته سریع و ساده برنامه‌نویسی کرد. بعلاوه آن، پوسته همیشه و همه‌جا، حتا در پایه‌ای‌ترین توزیع‌های لینوکس که حتا محیط گرافیکی ندارند، نیز وجود دارد و به همین علت، شما می‌توانید به راحتی برنامه‌تان را به کار بگیرید. همچنین، پوسته در برنامه‌هایی مهم است که در آن‌ها کارایی اهمیت کمتری نسبت به نصب آسان و پشتیبانی و قابلیت حمل دارد. پوسته برنامه‌ای است که به‌عنوان رابط بین شما و لینوکس فعالیت می‌کند و شما را قادر می‌سازد تا دستورات را برای اجرا به سیستم عامل بدهید.از این دیدگاه، درست همانند Command Prompt)  ویندوز عمل می‌کند، اما مطمئن باشید که پوسته لینوکس بسیار قوی‌تر است. مثلا می‌توان ورودی و خروجی را با علامت‌های > و<  تغییر داد، داده را می‌توان به کمک علامت  (خط عمودی) به‌طور همزمان بین چند برنامه واردpipe  کرد. در لینوکس کاملاً‌ عادی است که چند پوسته به طور همزمان مشغول به کار باشند و این حق مسلم شماست که تشخیص بدهید کدام یکی به درد کارتان می‌خورد. در شماره آینده  به برنامه‌نویسی پوسته خواهیم پرداخت.

محمدرضا قربانی‌

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها