لینکس سسٹم کال ٹیوٹوریل سی کے ساتھ۔

Linux System Call Tutorial With C



ہمارے آخری مضمون میں لینکس سسٹم کالز۔ ، میں نے ایک سسٹم کال کی وضاحت کی ، ان وجوہات پر تبادلہ خیال کیا جو کوئی انہیں کسی پروگرام میں استعمال کرسکتا ہے ، اور ان کے فوائد اور نقصانات پر غور کرتا ہے۔ یہاں تک کہ میں نے C کے اندر اسمبلی میں ایک مختصر مثال دی۔ بالکل ایک سنسنی خیز ترقی کی مشق نہیں ، لیکن اس نے اس نکتے کو واضح کیا۔

اس آرٹیکل میں ، ہم اپنے سی پروگرام میں حقیقی کام کرنے کے لیے اصل سسٹم کالز استعمال کرنے جا رہے ہیں۔ سب سے پہلے ، ہم جائزہ لیں گے اگر آپ کو سسٹم کال استعمال کرنے کی ضرورت ہے ، پھر Sendfile () کال کا استعمال کرتے ہوئے ایک مثال فراہم کریں جو کہ فائل کاپی کی کارکردگی کو ڈرامائی طور پر بہتر بنا سکتی ہے۔ آخر میں ، ہم لینکس سسٹم کالز کا استعمال کرتے ہوئے یاد رکھنے کے لیے کچھ نکات پر جائیں گے۔







اگرچہ یہ ناگزیر ہے کہ آپ اپنے سی ڈویلپمنٹ کیریئر کے کسی موقع پر سسٹم کال کا استعمال کریں گے ، جب تک کہ آپ اعلی کارکردگی یا کسی خاص قسم کی فعالیت کو نشانہ نہیں بناتے ، گلیبک لائبریری اور دیگر بنیادی لائبریریاں جن میں اہم لینکس ڈسٹری بیوشن شامل ہیں ، اکثریت کا خیال رکھیں گے۔ آپ کی ضروریات.



گلیبک سٹینڈرڈ لائبریری ایک کراس پلیٹ فارم مہیا کرتی ہے ، جس میں افعال انجام دینے کے لیے اچھی طرح سے تجربہ کیا گیا فریم ورک ہوتا ہے جو دوسری صورت میں سسٹم مخصوص سسٹم کالز کی ضرورت ہوتی ہے۔ مثال کے طور پر ، آپ fscanf () ، fread () ، getc () ، وغیرہ کے ساتھ فائل پڑھ سکتے ہیں ، یا آپ ریڈ () لینکس سسٹم کال استعمال کرسکتے ہیں۔ glibc افعال مزید خصوصیات مہیا کرتے ہیں (یعنی بہتر ایرر ہینڈلنگ ، فارمیٹڈ IO ، وغیرہ) اور کسی بھی نظام glibc سپورٹ پر کام کریں گے۔



دوسری طرف ، ایسے اوقات ہوتے ہیں جب غیر سمجھوتہ کرنے والی کارکردگی اور عین مطابق عملدرآمد اہم ہوتا ہے۔ ریپر جو fread () مہیا کرتا ہے اس میں اوور ہیڈ شامل ہونے والا ہے ، اور اگرچہ معمولی ، مکمل طور پر شفاف نہیں ہے۔ مزید برآں ، آپ کو اضافی خصوصیات کی ضرورت یا ضرورت نہیں ہوسکتی ہے جو ریپر فراہم کرتا ہے۔ اس صورت میں ، آپ کو ایک نظام کال کے ساتھ بہترین طور پر پیش کیا جاتا ہے۔





آپ سسٹم کالز کو ایسے افعال انجام دینے کے لیے بھی استعمال کرسکتے ہیں جو ابھی تک glibc کے تعاون سے نہیں ہیں۔ اگر آپ کی glibc کی کاپی تازہ ترین ہے تو ، یہ مشکل سے ہی ایک مسئلہ ہوگا ، لیکن نئی دانا کے ساتھ پرانی تقسیم پر ترقی پانے کے لیے اس تکنیک کی ضرورت پڑسکتی ہے۔

اب چونکہ آپ نے دستبرداری ، انتباہات اور ممکنہ راستے پڑھے ہیں ، اب آئیے کچھ عملی مثالوں پر غور کریں۔



ہم کس CPU پر ہیں؟

ایک سوال جو زیادہ تر پروگرام شاید پوچھنے کے بارے میں نہیں سوچتے ، لیکن اس کے باوجود ایک درست ہے۔ یہ ایک سسٹم کال کی ایک مثال ہے جسے glibc کے ساتھ نقل نہیں کیا جا سکتا اور یہ glibc ریپر سے ڈھکا ہوا نہیں ہے۔ اس کوڈ میں ، ہم getcpu () کال کو براہ راست syscall () فنکشن کے ذریعے کال کریں گے۔ syscall فنکشن مندرجہ ذیل کام کرتا ہے:

syscall(SYS_call،arg1،arg2،...)؛

پہلی دلیل ، SYS_call ، ایک تعریف ہے جو سسٹم کال کی تعداد کی نمائندگی کرتی ہے۔ جب آپ sys/syscall.h شامل کرتے ہیں تو یہ شامل ہوتے ہیں۔ پہلا حصہ SYS_ اور دوسرا حصہ سسٹم کال کا نام ہے۔

کال کے لیے دلائل اوپر arg1 ، arg2 میں جاتے ہیں۔ کچھ کالوں میں مزید دلائل کی ضرورت ہوتی ہے ، اور وہ اپنے مین پیج سے ترتیب میں جاری رہیں گی۔ یاد رکھیں کہ زیادہ تر دلائل ، خاص طور پر ریٹرنز کے لیے ، مالاک فنکشن کے ذریعے مختص چار صفوں یا میموری کے لیے پوائنٹرز کی ضرورت ہوگی۔

example1.c

#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں

intمرکزی() {

دستخط شدہسی پی یو،نوڈ؛

// سسٹم کال کے ذریعے موجودہ CPU کور اور NUMA نوڈ حاصل کریں۔
// نوٹ کریں کہ اس میں کوئی گلیبک ریپر نہیں ہے لہذا ہمیں اسے براہ راست کال کرنا چاہئے۔
syscall(SYS_getcpu، &سی پی یو، &نوڈ،خالی)؛

// معلومات دکھائیں۔
پرنٹ ایف (یہ پروگرام CPU کور٪ u اور NUMA نوڈ٪ u پر چل رہا ہے۔nn'،سی پی یو،نوڈ)؛

واپسی ؛

}

مرتب کرنے اور چلانے کے لیے۔:

جی سی سی مثال 1۔ج -o مثال 1۔
./مثال 1

مزید دلچسپ نتائج کے لیے ، آپ pthreads لائبریری کے ذریعے تھریڈز کو گھما سکتے ہیں اور پھر اس فنکشن کو کال کر کے دیکھ سکتے ہیں کہ آپ کا تھریڈ کس پروسیسر پر چل رہا ہے۔

Sendfile: اعلی کارکردگی۔

Sendfile سسٹم کالز کے ذریعے کارکردگی بڑھانے کی ایک بہترین مثال فراہم کرتا ہے۔ Sendfile () فنکشن ایک فائل ڈسریکٹر سے دوسرے میں ڈیٹا کاپی کرتا ہے۔ ایک سے زیادہ fread () اور fwrite () افعال استعمال کرنے کے بجائے ، Sendfile دانا کی جگہ میں منتقلی کرتا ہے ، اوور ہیڈ کو کم کرتا ہے اور اس طرح کارکردگی میں اضافہ کرتا ہے۔

اس مثال میں ، ہم ایک فائل سے دوسری فائل میں 64 MB ڈیٹا کاپی کرنے جا رہے ہیں۔ ایک ٹیسٹ میں ، ہم معیاری لائبریری میں پڑھنے/لکھنے کے معیاری طریقے استعمال کرنے جا رہے ہیں۔ دوسرے میں ، ہم اس ڈیٹا کو ایک جگہ سے دوسری جگہ اڑانے کے لیے سسٹم کالز اور sendfile () کال استعمال کریں گے۔

test1.c (glibc)

#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں

#ڈیفائن BUFFER_SIZE 67108864۔
#Define BUFFER_1 'buffer1'
#Define BUFFER_2 'buffer2'

intمرکزی() {

فائل*غلط، *ختم؛

پرنٹ ایف ('nروایتی glibc افعال کے ساتھ I/O ٹیسٹ۔nn')؛

// ایک BUFFER_SIZE بفر پکڑو۔
// بفر میں بے ترتیب ڈیٹا ہوگا لیکن ہمیں اس کی پرواہ نہیں ہے۔
پرنٹ ایف (64 MB بفر مختص کرنا:)؛
چار *بفر= (چار *) malloc (بفر کا سائز)؛
پرنٹ ایف ('ہو گیا۔n')؛

// fOut پر بفر لکھیں۔
پرنٹ ایف ('پہلے بفر پر ڈیٹا لکھنا:')؛
غلط= fopen (BUFFER_1۔، 'wb')؛
لکھنا (بفر، کا سائز(چار)،بفر کا سائز،غلط)؛
fclose (غلط)؛
پرنٹ ایف ('ہو گیا۔n')؛

پرنٹ ایف ('پہلی فائل سے دوسری میں ڈیٹا کاپی کرنا:')؛
ختم= fopen (BUFFER_1۔، 'ر ب')؛
غلط= fopen (BUFFER_2۔، 'wb')؛
پھیلاؤ (بفر، کا سائز(چار)،بفر کا سائز،ختم)؛
لکھنا (بفر، کا سائز(چار)،بفر کا سائز،غلط)؛
fclose (ختم)؛
fclose (غلط)؛
پرنٹ ایف ('ہو گیا۔n')؛

پرنٹ ایف ('بفر کو آزاد کرنا:')؛
مفت (بفر)؛
پرنٹ ایف ('ہو گیا۔n')؛

پرنٹ ایف ('فائلیں حذف کرنا:')؛
دور (BUFFER_1۔)؛
دور (BUFFER_2۔)؛
پرنٹ ایف ('ہو گیا۔n')؛

واپسی ؛

}

test2.c (سسٹم کالز)

#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں

#ڈیفائن BUFFER_SIZE 67108864۔

intمرکزی() {

intغلط،ختم؛

پرنٹ ایف ('nI/O testfile () اور متعلقہ سسٹم کالز کے ساتھ ٹیسٹ۔nn')؛

// ایک BUFFER_SIZE بفر پکڑو۔
// بفر میں بے ترتیب ڈیٹا ہوگا لیکن ہمیں اس کی پرواہ نہیں ہے۔
پرنٹ ایف (64 MB بفر مختص کرنا:)؛
چار *بفر= (چار *) malloc (بفر کا سائز)؛
پرنٹ ایف ('ہو گیا۔n')؛


// fOut پر بفر لکھیں۔
پرنٹ ایف ('پہلے بفر پر ڈیٹا لکھنا:')؛
غلط=کھلا('بفر 1'،O_RDONLY)؛
لکھیں(غلط، &بفر،بفر کا سائز)؛
بند کریں(غلط)؛
پرنٹ ایف ('ہو گیا۔n')؛

پرنٹ ایف ('پہلی فائل سے دوسری میں ڈیٹا کاپی کرنا:')؛
ختم=کھلا('بفر 1'،O_RDONLY)؛
غلط=کھلا('بفر 2'،O_RDONLY)؛
فائل بھیجیں(غلط،ختم، ،بفر کا سائز)؛
بند کریں(ختم)؛
بند کریں(غلط)؛
پرنٹ ایف ('ہو گیا۔n')؛

پرنٹ ایف ('بفر کو آزاد کرنا:')؛
مفت (بفر)؛
پرنٹ ایف ('ہو گیا۔n')؛

پرنٹ ایف ('فائلیں حذف کرنا:')؛
لنک ختم کریں('بفر 1')؛
لنک ختم کریں('بفر 2')؛
پرنٹ ایف ('ہو گیا۔n')؛

واپسی ؛

}

1 اور 2 ٹیسٹ مرتب اور چلانے

ان مثالوں کو بنانے کے لیے ، آپ کو اپنی تقسیم پر نصب کردہ ترقیاتی ٹولز کی ضرورت ہوگی۔ ڈیبین اور اوبنٹو پر ، آپ اسے انسٹال کرسکتے ہیں:

مناسبانسٹال کریںتعمیراتی ضروریات

پھر اس کے ساتھ مرتب کریں:

جی سی سیtest1.cیاٹیسٹ 1&& جی سی سیtest2.cیاٹیسٹ 2۔

دونوں کو چلانے اور کارکردگی کو جانچنے کے لیے ، چلائیں:

وقت./ٹیسٹ 1&& وقت./ٹیسٹ 2۔

آپ کو اس طرح کے نتائج حاصل کرنے چاہئیں:

روایتی glibc افعال کے ساتھ I/O ٹیسٹ۔

64 MB بفر الاٹ کرنا: ہو گیا۔
پہلے بفر پر ڈیٹا لکھنا: ہو گیا۔
پہلی فائل سے دوسری میں ڈیٹا کاپی کرنا: ہو گیا۔
بفر کو آزاد کرنا: ہو گیا۔
فائلوں کو حذف کرنا: ہو گیا۔
اصلی 0m0.397s
صارف 0m0.000s
sys 0m0.203s۔
I/O testfile () اور متعلقہ سسٹم کالز کے ساتھ ٹیسٹ۔
64 MB بفر الاٹ کرنا: ہو گیا۔
پہلے بفر پر ڈیٹا لکھنا: ہو گیا۔
پہلی فائل سے دوسری میں ڈیٹا کاپی کرنا: ہو گیا۔
بفر کو آزاد کرنا: ہو گیا۔
فائلوں کو حذف کرنا: ہو گیا۔
اصلی 0m0.019s
صارف 0m0.000s
sys 0m0.016s۔

جیسا کہ آپ دیکھ سکتے ہیں ، کوڈ جو سسٹم کالز کا استعمال کرتا ہے وہ glibc کے مساوی سے بہت تیزی سے چلتا ہے۔

یاد رکھنے کی باتیں۔

سسٹم کالز کارکردگی کو بڑھا سکتی ہیں اور اضافی فعالیت فراہم کر سکتی ہیں ، لیکن وہ ان کے نقصانات کے بغیر نہیں ہیں۔ لائبریری کے افعال کے مقابلے میں آپ کو پلیٹ فارم پورٹیبلٹی کی کمی اور بعض اوقات کم فعالیت کے خلاف فراہم کردہ سسٹم کالز کو وزن کرنا پڑے گا۔

کچھ سسٹم کالز کا استعمال کرتے وقت ، آپ کو لائبریری کے افعال کے بجائے سسٹم کالز سے لوٹے گئے وسائل کو استعمال کرنے کا خیال رکھنا چاہیے۔ مثال کے طور پر ، glibc کے fopen () ، fread () ، fwrite () ، اور fclose () افعال کے لیے استعمال ہونے والی FILE ڈھانچہ اوپن () سسٹم کال سے فائل ڈسریکٹر نمبر کی طرح نہیں ہے (ایک عدد کے طور پر لوٹا گیا ہے)۔ ان کو ملانے سے مسائل پیدا ہو سکتے ہیں۔

عام طور پر ، لینکس سسٹم کالز میں glibc افعال سے کم بمپر لین ہوتی ہیں۔ اگرچہ یہ سچ ہے کہ سسٹم کالز میں کچھ غلطی سنبھالنے اور رپورٹنگ ہوتی ہے ، آپ کو ایک glibc فنکشن سے مزید تفصیلی فعالیت ملے گی۔

اور آخر میں ، سیکورٹی پر ایک لفظ۔ سسٹم کالز دانا کے ساتھ براہ راست انٹرفیس کرتی ہے۔ لینکس دانا کے پاس صارف کی زمین سے شینانیگن کے خلاف وسیع تحفظات ہیں ، لیکن دریافت شدہ کیڑے موجود ہیں۔ اس بات پر بھروسہ نہ کریں کہ سسٹم کال آپ کے ان پٹ کی توثیق کرے گی یا آپ کو سیکیورٹی کے مسائل سے الگ کرے گی۔ اس بات کو یقینی بنانا دانشمندانہ ہے کہ جو ڈیٹا آپ سسٹم کال کے حوالے کرتے ہیں اسے سینیٹائز کیا جاتا ہے۔ قدرتی طور پر ، یہ کسی بھی API کال کے لیے اچھا مشورہ ہے ، لیکن دانا کے ساتھ کام کرتے وقت آپ محتاط نہیں رہ سکتے۔

مجھے امید ہے کہ آپ لینکس سسٹم کالز کی سرزمین میں اس گہرے غوطے سے لطف اندوز ہوئے ہوں گے۔ لینکس سسٹم کالز کی مکمل فہرست کے لیے ، ہماری ماسٹر لسٹ دیکھیں۔