read (فراخوان سیستمی)
کتابخانه پازیکس سی |
---|
|
در سیستمعاملهای سازگار با استاندارد پازیکس، برنامههایی که نیاز به خواندن اطلاعات موجود در یک فایل دارند، از فراخوان سیستمی read() استفاده میکنند. پس از باز کردن فایل توسط فراخوان open() و برگشتن یک توصیفگر، آن توصیفگر از آن پس به عنوان شناسه فایل عمل کرده و تمامی عملیات خواندن/نوشتن/جابجا کردن عقربهٔ فایل، از طریق همان توصیفگر -- که یک عدد صحیح است -- بر روی فایل صورت میگیرد. فراخوان read() مقدار مشخصی از دادهها را بر حسب بایت از فایل مورد نظر میخواند و آن را در یک بافر ذخیره میکند. هم بافر مورد نظر و هم مقدار مورد نیاز برای خواندن، به عنوان پارامتر برای read() ارسال میشوند. این فراخوان سه پارامتر دارد:
- توصیفگر پرونده که فایل مورد نظر به جهت خواندن اطلاعات را مشخص میکند.
- بافری برای ذخیره کردن اطلاعات خوانده شده
- تعداد بایتهایی که باید از فایل خوانده شده و در بافر قرار گیرد، نباید از اندازه بافر بیشتر باشد.
این فراخوان توسط پازیکس به صورت استاندارد درآمدهاست. امضای آن به صورت زیر است:
ssize_t read(int fd, void *buf, size_t count);
مقدار برگشتی این تابع، تعداد بایتهایی است که عملاً خوانده شدهاست. اگر مقدار صفر برگردد، به این معنیست که فایل به انتهای خود رسیدهاست. پس از خواندن اطلاعات مورد نظر، عقربه فایل هم بروز میشود (عقربه فایل مشخص میکند که عمل بعدی خواندن باید اطلاعات را از کجای فایل بخواند). اگر مقدار برگشتی read() از مقدار درخواست شدن برای خواندن کمتر باشد، به معنی خطا نیست. این اتفاق مثلاً وقتی میتواند بیوفتد که عقربه فایل به 40 بایت انتهایی اشاره میکند و درخواست خواندن 60 بایت داده شدهاست که در این صورت عدد ۴۰ برخواهد گشت. یا در حین خواندن از یک ترمینال، هرگاه یک کاراکتر newline در ورودی ظاهر شد، خواندن متوقف شده و میزان بایت خوانده شده برگشت داده میشود. همچنین در حین خواندن از یک pipe یا FIFO هم در صورتیکه اطلاعاتی بیشتر از آنچه که در pipe یا FIFO موجود است درخواست شود، read() تنها اطلاعات موجود را برخواهد گرداند. همچنین این امکان وجود دارد که پیش از اینکه read() بتواند میزان درخواست شده را بخواند، توسط یک سیگنال دچار وقفه شود.
در صورت بروز خطا، مقدار -1 برخواهد گشت و errno هم با کد خطای مورد نظر مقداردهی خواهد شد.
read() یک فراخوان سیستمی است و عملیات خواندن را به صورت مستقیم و بافرنشده انجام میدهد. برخلاف fread() که یک تابع در کتابخانه استاندارد سی است و عملیات خواندن را به صورت بافرشده انجام میدهد و به نوبهٔ خود از read() استفاده میکند.
جستارهای وابسته
[ویرایش]منابع
[ویرایش]Wikipedia contributors. Read (system call). Wikipedia, The Free Encyclopedia. March 13, 2015, 22:01 UTC. Available at: http://en.wikipedia.org/w/index.php?title=Read_(system_call)&oldid=651252136. Accessed March 16, 2015.