در لینوکس و یونیکس بدون در نظرگرفتن اینکه چه نوع درایو یا سخت افزاری برروی سیستم نصب گردیده کلیه منابع سیستم در یک دایرکتوری اصلی بنام ریشه ( / ) یا ROOT قرار دارد .
بطورمعمول این روش بسیار بهتر و کاراتراز روش سنتی نامگذاری درایوها در ویندوز عمل میکند و فایل سیستم را صرفنظر از نوع سخت افزار بسیار ساده و کارآمد مینماید و این نکته وقتی نمود پیداخواهد کرد که شما مجبور باشید سخت افزار جدیدی مثل هارد دیسک دوم و سوم و ... و یا منابع به اشتراک گذاشته شده از طریق شبکه را به سیستم خود بیافزائید .
نباید از نظر دورداشت که برای کاربران سیستم عامل ویندوز و کسانی که با سیستم سنتی نامگذاری درایوها مثلا C ، D ، E و ... عادت کرده اند درک درست ساختار فایل سیستم لینوکس و کار با آن قدری پیچیده بنظر میرسد . اما بطور خلاصه باید گفت که در لینوکس نباید بدنبال درایوهای خود بگردید ، چون کلیه محتویات دیسکها را در یک فایل سیستم واحد لینوکس میتوانید مشاهده و یا متصل نمائید . (directory tree)
بطور پیش گزیده محتویات درایوهای قابل جابجائی مثل سی دی و فلاپی درایو بصورت خودکار در این ساختا ر دیده نمیشوند و شما باید نخست این درایو ها را به فایل سیستم لینوکس متصل یا mount نمائید . همچنین بخاطر داشته باشید که قبل از خارج نمودن این گونه درایوها از کامپیوتر باید آنها را ابتدا از فایل سیستم جدا یا unmount نمود .
شما با عملیات mount کردن خواهید توانست طیف گسترده ای از فایل سیستمهای ایجاد شده توسط سایر سیستمهای عامل همچون ویندوز را مثلFAT, FAT32, NTFS بصورت خواندن و نوشتنی یا فقط خواندنی به سیستم لینوکس خود متصل کنید و از آنها در یک دایرکتوری درست مثل درایوهای سنتی ویندوز استفاده کنید . این موضوع در مورد اتصال درایوهای ZIP و فلاپی و سی دی و کلیه فایل سیستمهای دیگر صادق است .
برای درک بهتر موضوع به ارئه یک مثال میپردازم :
فرض کنید شما میخواهید درایو سی دی خود را به لینوکس متصل mount کرده و محتویات یک سی دی را مشاهده و از آن استفاده کنید:
ابتدا بایستی اجازه دسترسی به منابع سیستم را بعنوان کابر ریشه با تایپ دستور زیر و وارد نمودن password کاربر ریشه کسب کنید .
$ su
Enter password : ***********
در ادامه بایستی بدانید که محتویات فایل سیستم روی سی دی شما باید به لینوکس متصل و در داخل یک دایرکتوری که عموما در مسیر /mnt/cdrom/ یا هر کجای دیگر که خودتان صلاح بدانید مشاهده شود پس ابتدا بایستی دایرکتوری با نام cdrom در مسیر فوق با دستور زیر ایجاد یا از قبل وجود داشته باشد :
# mkdir /mnt/cdrom
سپس باید از دستور زیر برای اتصال این فایل سیستم به لینوکس استفاده نمائید :
# mount -t auto /dev/cdrom /mnt/cdrom
شاید میپرسید -t auto و یا /dev/cdrom چیست .؟
عبارت اول یعنی -t auto باعث شناسائی خودکار فایل سیستم موجود روی سی دی شده و استفاده از آن در نسخه های جدید لینوکس اختیاری است ، اما عبارت دوم یعنی /dev/cdrom محل اسقرار درایور یا گرداننده سی دی رام IDE interface را نشان میدهد و ممکن است بسته به محل اتصال کابل سی دی به کامپیوتر به صورت /dev/hdd یا /dev/hdb و یا /dev/hdc تغییر یابد .
در اینصورت بعنوان مثال شکل فرمان بدینگونه اصلاح خواهد شد :
# mount -t auto /dev/hdd /mnt/cdrom
اگر همه کارها را به درستی انجام داده باشید محتویات سی دی قرار گرفته در درایو سی دی رام را در دایرکتوری /mnt/cdrom مشاهده خواهید کرد .
در خاتمه کار باید با دستور زیر ابتدا سی دی را unmount کرده و سپس از درایو مربوطه خارج کرد :
# umount /mnt/cdrom
توجه کنید که برای unmount کردن هر وسیله آن ابزار نباید در حال بهره برداری یا inuse باشد .
بدیهی است در صورت عدم انجام مرحله آخر ممکن است درایو سی دی رام شما اجازه خروج سی دی را از جایگاه خود ندهد . البته باید خاطر نشان کرد که کل این عملیات در لینوکس بدلیل امنیت و کارائی بیشتر بدین صورت طراحی شده تا کاربران متعدد اجازه دسترسی همزمان را به منابع یک رسانه و ایجاد اختلال در عملیات سیستم عامل را نداشته و از امنیت بالاتری بهره مند شوند .
ضمنا در توزیعهای جدید لینوکس اغلب عملیات mount و unmount کردن درایو ها با نرم افزاری موسوم به kudzu بصورت کاملا اتوماتیک در آمده و کاربری آن بسیار ساده شده است .
فکر کنم این ۴۴ فصل دیگر کامل ترین مرجع برای آموزش حرفه ای لینوکس است! امیدوارم خوشتان بیاید...
کتاب آموزش گنو/لینوکس که به زبان فارسی هم هست کتاب خوب و مفیدی در زمینه اموزش لینوکس است با حجم 15MB .
این کتاب هم که به زبان فارسی است و نحوه پیکربندی و ساخت و کار یک سرور به وسیله APACHE را یاد می دهد با حجم تقریبا ۱MB
GnomeBaker : امـروزه کــمتر کـامپیوتری را مـیتوان یـافت کـه بـه یـک دستگاه نوشتن دیسکهای CD-R یا CD-RW مجهز نباشد. حتی کامپیوترهای همراه مدرن نیز از این موضوع مستثنی نیسـتند. قـیمت دستگاههای نوشتن DVD نیز به سرعت رو به افول است و با افزایش حجم دادهها انتظار میرود تا در آیندهای نزدیک جایگزین CD-R و CD-RW شوند.
نگاهی اجمالی به نوشتن CD و DVD در گنو/لینوکس
قـلـب اصـلی سیستم نگارش CD و DVD در گنو/لینوکس را چنـد بـسـته نـرمافـزاری تشـکـیل مـیدهـند کـه عـبـارتنـد از cdrecord،cdrdao و dvd+rw-tools. تمـامی ابــزارهـای نـوشـتـن CD و DVD در گنو/لینوکس – لااقل انواع بازمتن آن – در حقیقت پوستههایی گرافیکی برای این ابزارها هستند که امکانات جانبی دیگری نیز در اختیار دارند. مانند ایجاد فایلهای iso با استفاده از برنامه mkisofs، ایجاد دیسکهای صوتی با استفاده از cdda2wav و mpg321، ایجاد VCD با استفاده از vcdimager و امکانات دیگر.
GnomeBaker
ابـزار نـوشـتـن و ایـجـاد CD و DVD جـدیـد Gnomebaker ابزاری است که در مراحل اولیه توسعه قرار داشته و گستردگی امکانات آن همانند ابزارهای پیشرفتهای مانند k3b نمیبـاشـد. ایــن ابـزار در هنــگام نگارش این مقاله در نسخه 0.3 قرار دارد. کاربرانی که از محیط میزکار Gnome برای انجام امور روزمره خود استفاده مــیکـنند، از داشتن چنین ابزاری با اینکه امکانات کمتری نسبت به k3b دارد، بسیار خشنود خواهند بود.
در ابتدای کار استفاده از این نرمافزار به جای k3b کمی ممکن است شما را دلــزده کند. ایــن دلـزدگی را چیزی جز کمتر بـودن امکانات آن نمیبینم، ولی عملکرد کلی آن مطلوب است و به سرعت به وضع کمی عجیب آن عادت خواهید کرد!
Gnomebaker به نرمی کار کرده و دیسکهای شما را ایجاد مــیکـند یـا فـایلهای ISO را بر روی دیسک مینویسد و از آنجایی که یک نرمافزار مبتنی بر GTK است، در محیط Gnome به نرمی و سـرعت اجــرا مــیشـود و کـنـدی اجرای k3b را در محیط Gnome دارا نیست.
Gnomebaker یـک نـرمافـزار آزاد بـوده و تحـت مـجـوز GNU LGPL مـنـتــشر مــیشـود. بـرای دیـدن تـصاویـر بــیـشتـری از Gnomebaker در حال کار میتوانید به [۱] مراجعه کنید.
GnomeBaker در حال نوشتن یک فایل ISO بر روی دیسک
امکانات
اگر بخواهیم نگاهی کلی به امکانات آن داشته باشیم، موارد زیر چشمگیر هستند:
۱) ایجاد دیسکهای Data CD با قابلیت Multisession
۲) ایجاد دیسکهای Audio CD
۳) نوشتن ISO Images
۴) کپی از Data CD و ایجاد ISO از آن
۵) فرمت CD-RW
۶) فرمت DVD-RW
۷) کپی دیسکهای Audio CD
۸) ایجاد Data DVD
۹) سیستم مدیرفایل توکار برای اضافه کردن فایلها و دایرکتوریها برای ایجاد Data CD یا Data DVD
۱۰) ایجاد فایل ISO از فایلهایی که برای ایجاد Data CD یا Data DVD انتخاب میشوند.
۱۱) پشتیبانی از Burn Free
۱۲) خارج کردن خودکار دیسک از درایو پس از اتمام نوشتن
۱۳) شناسایی خودکار و اضافه کردن ابزارهای خواننده و یا نویسنده CD و DVD به لیست ابزارهای برنامه.
Gnomebaker از Cdهای تـا ۷۰۰ مـگـابـایت و DVD هـای تا ۸.۵ گیگابایت پشتیبانی میکند. یکی از قابلیتهای جالب آن امکان اضافه کردن دستی ابزارهای نوشتن CD و DVD است.
دریافت و نصب
صفحه خانگی پروژه Gnomebaker در آدرس [۲] قرار دارد. شما میتوانید بستههای مختلف قابل نصب را از [۳] دریافت و بر روی سیستم خود نصب کنید. حتی بستههایی برای نصب بر روی FreeBSD و لینوکسهای Gentoo و Arch نیز موجود میباشد. از آنجایی که بسته deb این ابزار مفید در مخــازن unstable و testing دبیان اضافه شده است، کاربران دبیان و تـوزیـعهـای مبـتنی بر آن که مخازن دبیان را در sources.list خود دارا هستند، میتـوانـند بـا دسـتـور زیـر Gnomebaker را دریافت و نصب کنند:
# apt-get install gnomebaker
نقاط ضعف
همـانطـور کـه گـفته شـد، Gnomebaker هنوز در مراحل بسیار ابتدایی توسعه است و به همین دلیل چندان نمیتوان از کمی امکانات در آن خــرده گرفت. با اینکه هنوز در نسخه 0.3 میباشد، امکانات ارائه شده به نسبت خوب بودهاند. یکی از مواردی اشکالی که زیاد بــه چشم میآید، عدم توانایی آن در تشخیص این است که اکنون یک دیسک درون درایو قرار داده شده. شما باید به صورت دستی به آن اعلام کنید که اکنون دیسک درون درایو موجود است، روی آن بنویس!
اضافه شدن امکانات ایجاد VCD نیـز میتواند مفید باشد، ولی امکان ذخیره فایلهای ایحاد شده برای Data CD یا Audio CD به نحوی که در دفعات بعدی امـکان فراخوانی آسان آنها فراهم باشد، مفیدتر است. با اینکه اکنون امکان ایجاد ISO از این فایلها وجود دارد، ولی در مــواردی کــه مـشـکل فضای دیسک وجود داشته باشد، ذخیره کردن آدرسها و فراخوانی مجدد برای نوشته شدن روی دیسک لازم به نظر میرسد.
داشتن امکان Clone CD همانند k3b در مواردی که کپی دیسـک بنا با دلایلی با دشواری همراه است، نیز میتواند مفید باشد.
نتیجهگیری کلی
اگر بخواهیم یک نتیــجهگــیری کــلی از آن داشـته باشیم، Gnomebaker مجموعه ابزارهای Gnome را کامل میکند. این ابزار با اینکه در مراحل ابتدای توسعه است، بســیار راحــتتــر و قــابـل قبولتر از Nautilus Burner عمل میکند و با روند توسعه آن امید آن میرود تا در آینده به سطح امکانات ابزارهای قدرتمنددی مانند k3b برسد.
منبع :foss.ir
قسمت دوم
Semaphore:
سمافر در لغت به معنی با پرچم به هم علامت دادن است و کار ان شبیه کار موتکس است با این فرق که بیشتر از دو مقدار locked و unlocked می تواند به خود بگیرد.و سمافر ها حاوی یک مقدار عددی هستند که بسته به شرایط می تواند مقادیر مثبت منفی و صفر به خود بگیرد و تصمیم می گیرد thread ها منتظر بمانند یا کارشان را انجام دهند.سمافرها راه بهتری را برای برنامه ریزی thread ها در اختیار ما می گذارند.
البته برای برنامه های ساده Multi-threading موتکس ها کافی به نظر می رسند.
برخلاف موتکس که دارای دو مقدارمیباشد یک سمافر در SDL دارای 2 به توان 32 حالت می باشد تمام مقادیری که یک Uint32 می تواند به خود بگیرد و وقتی مقدار ان صفر است
شبیه موتکس قفل شده رفتار می کند.
برای ساخت semaphore می توانید از تابع SDL_CreateSemaphore استفاده کنید.
SDL_sem *SDL_CreateSemaphore(Uint32 initial_value);
این تابع مقدار اولیه سمافر را دریافت می کند سپس یک اشاره گر به SDL_sem بر می گرداند.
برای نابود کردن یک سمافر هم می توانید از تابع SDL_DestroySemaphore استفاده کنید.
void SDL_DestroySemaphore(SDL_sem *sem);
که یک سمافردریافت و ان را از بین می برد.
سمافرها از Locked و Unlocked استفاده نمی کنند و به جای ان از Wait و Post استفاده می کنند.این دو مثل lock و unlock رفتار می کنند وقتی که در یک سمافر wait کنید اگر مقدار ان بزرگتر از صفر باشد یک واحد از ان کم می شود و سپس thread مورد نظر کار خود را به پایان می رساند.اگر مقدار ان برابر صفر باشد می ایستد تا مقدار ان بزرگتر از صفر شود و سپس اجرا می شود.
وقتی یک سمافر را post می کنید مثل unlock کردن ان می ماند ویکی به مقدار ان اضافه می شود تا thread های دیگر بتوانند کار خود را انجام دهند.
برای wait کردن بر روی سمافر شما باید از تابع SDL_SemWait استفاده کنید.
int SDL_SemWait(SDL_sem *sem);
این تابع صبر می کند تا مقدار سمافر مثبت سود سپس یکی از ان کم می کند و مقدار را بر می گرداند در صورت بروز خطا مقدار 1- را بر می گرداند.
همچنین شما می توانید با تایین زمان منتظر یک سمافر باشید
int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout);
شما می توانید مقدار یک سمافر را با post کردن ان زیاد کنید.
int SDL_SemPost(SDL_sem *sem);
همچنین شما می توانید مقدار یک سمافر را بوسیله تابع SDL_SemValue تشخیص دهید
Uint32 SDL_SemValue(SDL_sem *sem);
که یک سمافر می گیرد و مقدار ان را بر می گرداند.
در زیر مثالی از سمافر امده است توجه کنید متغییر ها قبلا تعریف شده اند :
//create semaphore
g_pSemaphore=SDL_CreateSemaphore(0);
//create three threads
g_pThread[0]=SDL_CreateThread(ThreadFunction,(void*)1);
g_pThread[1]=SDL_CreateThread(ThreadFunction,(void*)2);
g_pThread[2]=SDL_CreateThread(ThreadFunction,(void*)3);
//wait for a second
SDL_Delay(1000);
//post to the semaphore
SDL_SemPost(g_pSemaphore);
در اول کار ما یک سمافر با مقدار اولیه صفر تعریف می کنیم که تا وقتی سمافر post نشود همه thread ها باید منتظر بمانند.سپس 3 thread تعریف می کنیم بعد یک ثانیه صبر می کنیم تا thread ها اماده شوند و سپس سمافر را post می کنیم تا thread ها شروع به کار کنند.
وتابع thread ما هم به شکل زیر است.
//thread function
int ThreadFunction(void* data)
{
//grab thread number
int threadnumber=(int)data;
//wait for semaphore
fprintf(stdout,”Thread %d: Initialized.
”,threadnumber);
fprintf(stdout,”Thread %d: Waiting for semaphore.
”,threadnumber);
SDL_SemWait(g_pSemaphore);
//post to semaphore
fprintf(stdout,”Thread %d: Done waiting for semaphore.
”,threadnumber);
fprintf(stdout,”Thread %d: Posting semaphore.
”,threadnumber);
SDL_SemPost(g_pSemaphore);
//wait for semaphore again before terminating
fprintf(stdout,”Thread %d: Waiting for semaphore before terminating.
”,threadnumber);
SDL_SemWait(g_pSemaphore);
//terminate
fprintf(stdout,”Thread %d: Terminating.
”,threadnumber);
SDL_SemPost(g_pSemaphore);
//return 0
return(0);
}
هر thread دو بار منتظر سمافر می شود یک بار در شروع thread و یکبار در موقع پایان thread . و نتایج را در فایل stdout.txt می ریزد.(که در اینجا کد مربوط به فایل را در اول کار ننوشتم)
1.thread 1 ساخته میشود و منتظر سمافر می شود.
2. thread 2 ساخته میشود و منتظر سمافر می شود.
3. thread3 ساخته میشود و منتظر سمافر می شود.
4.برنامه سمافر را post می کند.
5.ترید 1 از انتظار بیروم می اید و سمافر را post می کند و دوباره منتظر می شود.
6.ترید 2 از انتظار بیروم می اید و سمافر را post می کند و دوباره منتظر می شود.
7.ترید 3 از انتظار بیروم می اید و سمافر را post می کند و دوباره منتظر می شود.
8.سراخر هر 3 ترید بسته می شوند(با جزییاتی که خودتان حدث بزنید).
همانطور که می بینید سمافر راه بهتری جلوی روی ما می گذارد و مثلا اگر در برنامه 2 post را می فرستادیم 2 تا thread با هم کار می کردند.
متغییرهای شرطی :
سر اخر به متغییر های شرطی می رسیم که روشی است برای استفاده درست از موتکس و thread است و بر خلاف موتکس و سمافر دارای حالت (مثل locked یا unlocked) نیست
SDL_cond *SDL_CreateCond(void);
بوسیله این تابع می توانیم یک متغییر شرطی تعریف کنیم.
و به وسیله تابع زیر می توانیم یک متغییر شرطی را از بین ببریم.
void SDL_DestroyCond(SDL_cond *cond);
...
به منظور این که سمافر ها تمام نیاز ما را بر طرف می کنند من فعلا متغییر های شرطی را توضیح نمی دهم اگر کسی نیاز به توضیح داشت به من بگویید!