POSIX سی پروگرامنگ میں فنکشن پڑھیں۔

Posix Read Function C Programing



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

فنکشن کی تعریف

اپنے کوڈ میں ریڈ فنکشن کی وضاحت کرنے سے پہلے ، آپ کو کچھ مطلوبہ پیکجز شامل کرنا ہوں گے۔







#شامل کریں

یہ ہے کہ آپ POSIX ریڈ فنکشن کی وضاحت کیسے کرتے ہیں:



>>ssize_t پریڈ۔(intہاتھی دانت ،باطل *بف ،size_tnbyte ، off_t آفسیٹ۔)؛
>>ssize_t پڑھا(intایف ڈی ،باطل *بف ،size_tnbytes)؛

پڑھنے کے طریقہ کار سے تین پیرامیٹر دلائل لیے جا سکتے ہیں:



int fd: فائل کا فائل ڈسکریپٹر جہاں سے معلومات پڑھنی ہیں۔ ہم یا تو اوپن سسٹم کال کے ذریعے حاصل کردہ فائل ڈسریکٹر کا استعمال کر سکتے ہیں ، یا ہم بالترتیب عام ان پٹ ، باقاعدہ آؤٹ پٹ ، یا باقاعدہ غلطی کا حوالہ دیتے ہوئے 0 ، 1 ، یا 2 استعمال کرسکتے ہیں۔





باطل *buf: بفر یا کریکٹر ارے جس میں پڑھنے والے ڈیٹا کو محفوظ اور رکھا جانا چاہیے۔

Size_t nbyte: بائٹس کی تعداد جو کاٹنے سے پہلے دستاویز سے پڑھنے کی ضرورت ہے۔ تمام معلومات بفر میں محفوظ کی جاسکتی ہیں اگر پڑھی جانے والی معلومات nbytes سے چھوٹی ہوں۔



تفصیل

ریڈ () طریقہ 'nbyte' بائٹس کو بفر کیش میں پڑھنے کی کوشش کرتا ہے جس کا حوالہ 'buf' نے یا تو کھلی دستاویز کے بیان کنندہ 'Fildes' یا 'fd' سے منسلک فائل سے لیا ہے۔ یہ ایک ہی سلسلہ ، FIFO ، یا ٹرمینل یونٹ پر کئی بیک وقت پڑھنے کی نوعیت کی وضاحت نہیں کرتا ہے۔

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

جب گنتی 0 ہے ، پڑھیں () ذیل میں بیان کردہ غلطیوں کو پہچانیں گے۔ اگر کوئی غلطیاں نہیں ہیں ، یا اگر ریڈ () کو غلطیوں کا حساب نہیں دیا جاتا ہے تو ، ایک ریڈ () 0 کی گنتی کے ساتھ صفر حاصل کرتا ہے اور اس وجہ سے اس کے کوئی اور اثرات نہیں ہوتے ہیں۔

اگر POSIX.1 کے مطابق گنتی SSIZE_MAX سے زیادہ ہے ، تو اس کا نتیجہ عمل درآمد سے طے ہوتا ہے۔

واپسی کی قیمت۔

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

خرابیاں۔

پریڈ اور ریڈ فنکشن ناکام ہوگا اگر یہ غلطیاں پائی جاتی ہیں:

ایگن:

دستاویز یا فائل کی وضاحت کرنے والا 'fd' ایک غیر ساکٹ فائل سے تعلق رکھتا ہے جسے غیر بلاکنگ (O NONBLOCK) کا لیبل لگا ہوا ہے اور پڑھنے کو روک دے گا۔

ایولڈ بلاک:

وضاحتی 'fd' ایک ساکٹ سے تعلق رکھتا ہے جسے نان بلاکنگ (O_NONBLOCK) کا لیبل لگا ہوا ہے اور پڑھنے کو روک دے گا۔

ای بی اے ڈی ایف:

ہوسکتا ہے کہ 'fd' قابل استعمال وضاحتی نہ ہو ، یا یہ پڑھنے کے لیے کھلا نہ ہو۔

EFAULT:

یہ تب ہوتا ہے جب آپ کا 'بف' آپ کے قابل رسائی پتے کی جگہ سے باہر ہو۔

EINTR:

معلومات کے ڈیٹا کو پڑھنے سے پہلے ، کال سگنل سے ٹوٹ گئی ہو گی۔

انتخاب:

یہ خرابی اس وقت ہوتی ہے جب آپ کا 'fd' ڈسکریپٹر کسی شے میں شامل ہو ، جو پڑھنے کے لیے موزوں نہ ہو ، یا دستاویز کو O_DIRECT پرچم کے ساتھ کھول دیا گیا ہو ، اور 'buf' میں بیان کردہ ایک یا دوسرا پتہ ، گنتی میں اشارہ کردہ قیمت ، یا دستاویز آفسیٹ مناسب طریقے سے وابستہ نہیں ہے۔

انتخاب:

ڈسکریپٹر 'fd' timerfd_create (2) پر کال کا استعمال کرتے ہوئے تشکیل دیا گیا ہو گا ، اور غلط سائز کا بفر پڑھنے کے لیے دیا گیا ہے۔

EIO:

یہ ایک ان پٹ/آؤٹ پٹ غلطی ہے۔ یہ اس وقت ہوتا ہے جب بیک گراؤنڈ پراسس گروپ اپنے ریگولیٹری ٹرمینل سے پڑھنے کی کوشش کرتا ہے ، اور ایک یا دوسرا SIGTTIN کو نظر انداز کر رہا ہے یا بلاک کر رہا ہے ، یا اس کے پراسیس گروپ کو رنج ہے۔ اس غلطی کی ایک اور وجہ نچلے درجے کی ان پٹ/آؤٹ پٹ غلطی ہو سکتی ہے اس دوران ہارڈ ڈسک یا ٹیپ سے پڑھنا۔ نیٹ ورکڈ ڈیٹا فائلوں پر EIO کی ایک اور ممکنہ وجہ فائل ڈسریکٹر پر ایڈوائزری لاکنگ کو ہٹانا اور اس لاک کی ناکامی ہے۔

EISDIR:

فائل کی وضاحت کرنے والا 'fd' ایک ڈائریکٹری سے تعلق رکھتا ہے۔

نوٹس:

بہت سی دوسری غلطیاں بھی ہو سکتی ہیں ، ڈسکریپٹر 'fd' سے منسلک شے پر ہنگامی۔ دونوں size_t اور ssize_t فارم غیر نشان زدہ ہیں اور عددی ڈیٹا کی اقسام POSIX.1 کے ذریعہ متعین ہیں۔ لینکس پر ، زیادہ سے زیادہ 0x7ffff000 (2،147،479،552) بائٹس ریڈنگ فنکشن (اور مساوی سسٹم کالز) کے ذریعے منتقل کیے جا سکتے ہیں ، اصل میں منتقل ہونے والے بائٹس کی تعداد لوٹاتے ہیں (32 بٹ اور 64 بٹ دونوں پلیٹ فارمز پر)۔ این ایف ایس فائل سسٹم کے ساتھ ، ٹائم اسٹیمپ کے پہلے لمحے میں معلومات کے چھوٹے دھارے پڑھ کر تبدیل کیا جاتا ہے ، بعد کی کالیں ایسا نہیں کریں گی۔ یہ کلائنٹ سائیڈ اوصاف کی کیشنگ کی وجہ سے شروع ہوا ہے ، حالانکہ تمام نہیں ، این ایف ایس کلائنٹس نے st_atime (آخری فائل تک رسائی کا وقت) کے ذریعے سرور کو اپ ڈیٹ کرنا چھوڑ دیا ہے اور کلائنٹ کے بفر سے مکمل ہونے والے کلائنٹ سائیڈ ریڈز st- میں تبدیلیاں نہیں کریں گے۔ سرور پر وقت کے طور پر کوئی سرور سائیڈ ریڈنگ دستیاب نہیں ہے۔ کلائنٹ سائیڈ وصف کیچنگ کو ہٹا کر ، UNIX میٹا ڈیٹا تک رسائی حاصل کی جا سکتی ہے ، لیکن اس سے سرور پر بوجھ میں نمایاں اضافہ ہوگا اور زیادہ تر معاملات میں پیداواری صلاحیت متاثر ہوگی۔

مثال 01:

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

مندرجہ بالا کوڈ کا آؤٹ پٹ جیسا کہ نیچے دی گئی تصویر میں دکھایا گیا ہے۔

مثال 02:

پڑھنے کی تقریب کے کام کی وضاحت کے لیے ایک اور مثال ذیل میں دی گئی ہے۔

ایک اور فائل بنائیں اور کوڈ کو نیچے لکھیں جیسا کہ اس میں ہے۔ یہاں دو وضاحتی ہیں ، fd1 اور fd2 ، کہ دونوں کی اپنی کھلی میز فائل تک رسائی ہے۔ تو foobar.txt کے لیے ، ہر وضاحتی کے پاس اس کی فائل کا مقام ہوتا ہے۔ foobar.txt کا پہلا بائٹ fd2 سے ترجمہ کیا گیا ہے ، اور نتیجہ c = f ہے ، c = o نہیں۔

نتیجہ

ہم نے C پروگرامنگ میں POSIX ریڈ فنکشن کو موثر انداز میں پڑھا ہے۔ امید ہے کہ کوئی شک باقی نہیں رہا۔