تحديد ما إذا كان واصف الملف القابل للقراءة هو نهاية قراءة الأنبوب

StackOverflow https://stackoverflow.com/questions/3639454

سؤال

أود استخدام 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) سيخبرك ما إذا كان واصف الملف هو أي من هذه.

في وضعي ، يغطي هذا كل الحالات التي كنت مهتمًا بها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top