تحديد ما إذا كان واصف الملف القابل للقراءة هو نهاية قراءة الأنبوب
-
30-09-2019 - |
سؤال
أود استخدام splice
إلى صفر البيانات من STDIN_FILENO
إلى واصف ملف (والذي يمكن أن يكون إلى ملف منتظم أو جهاز أو حظر أو FIFO أو أي شيء يمكن فتحه open
). لكي تستخدم splice
, ، إما من واصف الملف أو إلى يجب أن يكون واصف الملف هو النهاية المناسبة للأنبوب ، لذلك يتم إنشاء أنبوب عمومًا ليكون بمثابة عازلة وسيطة عندما يريد المبرمج أن يقوم بتكسير البيانات من غير أنبوب إلى غير أنبوب. ومع ذلك، إذا STDIN_FILENO
هو بالفعل نهاية قراءة الأنابيب ، ثم يمكنني تخطي هذه الخطوة ومحاولة لصقها مباشرة STDIN_FILENO
إلى واصف الملف الآخر. لذلك ، أود أن أكون قادرًا على تحديد ما إذا كان STDIN_FILENO
هي نهاية قراءة الأنابيب.
هل هناك مكالمة نظام Linux يمكنها تحديد ما إذا كانت STDIN_FILENO
هل نهاية القراءة للأنبوب؟
المحلول
للحصول على معلومات حول FD مفتوح ، يمكنك استخدام FSTAT (). أعتقد أن ST_MODE من النتيجة يجب أن يكون s_ififo لأنبوب. بدلاً من ذلك ،/proc/self/fd/و/proc/self/fdinfo/قدم أيضًا بعض المعلومات حول واصف الملف. ضع في اعتبارك أن /proc محدد Linux.
ومع ذلك ، أعتقد أنه قد يكون من الأسهل مجرد محاولة استخدام Slitsing () أولاً وإذا فشل (مع einval؟) يعود إلى سحرك.
نصائح أخرى
كبديل، lseek()
سوف تفشل مع ESPIPE
إذا كان "FD مرتبطًا بأنبوب أو مقبس أو FIFO." لذلك لا يوجد lseek(fd, 0, SEEK_CUR)
سيخبرك ما إذا كان واصف الملف هو أي من هذه.
في وضعي ، يغطي هذا كل الحالات التي كنت مهتمًا بها.