unistd.h قراءة () وقراءة المزيد من البيانات ثم يتم كتابتها

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

سؤال

وأنا قراءة / كتابة البيانات من توجيه إخراج مسمى. على الجانب الكتابة تقول ان انها كتابة ثابتة 110 بايت. على الجانب القراءة للغالبية الوقت الذي يقول أنه يقرأ 110 بايت وهو الصحيح، ولكن مرة أخرى، ويقول القراءة 220 بايت أو 330 بايت. وهو الحق في حقيقة أنني عندما طباعته انها طبع الرسالة نفسها مرتين أو ثلاث مرات على التوالي في نفس القراءة (). في التعليمات البرمجية أدناه للقراءة أفعل شيئا خاطئا مع memset لمسح شار؟ لا أستطيع التفكير في أي طريقة أخرى انها قراءة أكثر ثم يتم كتابة ما لم يقم بشيء في أكثر من المخزن المؤقت.

int fd1, numread;
char bufpipe[5000];

    while(1)
    {
        fd1 = open("/tmp/testPipe", O_RDONLY);
        numread = read(fd1,bufpipe, 5000);//->this should always be 110
        if(numread > 1)
        {
            printf("READ: %i", numread); 
            bufpipe[numread+1] = '\0';
            memset(bufpipe,'\0',5001);
            close(fd1);
        }
    }
هل كانت مفيدة؟

المحلول

وهذا ما يلي:

memset(bufpipe,'\0',5001);

ووالكتابة من قبل بايت واحد، لأن لديك بايت 5000 فقط.

ولكن "مشكلة" الرئيسي هو أن read(..., 5000) سوف تقرأ دائما بقدر ما يمكن أن تصل إلى 5000 بايت - يبدو لك أن تكون على افتراض أنه سيكون للقراءة فقط بقدر ما هو مكتوب في دفعة واحدة من قبل الكاتب، وهي ليست صحيح. إذا كان الكاتب يكتب علبتي 110 بايت بين اثنين من يقرأ، ثم انها صحيحة تماما أن القارئ يقرأ 220 بايت.

إذا كنت بحاجة لقراءة فقط حزمة واحدة في كل مرة، لديك لجعل الحزم الخاص يصف الذاتي. هكذا على سبيل المثال، بايت الأربعة الأولى تحتوي على عدد من وحدات البايت لمتابعة. ثم يمكنك أن تقرأ حزمة واحدة عن طريق قراءة أربعة بايت، وتحويل ذلك إلى عدد صحيح، ثم قراءة هذا العدد من بايت البيانات.

نصائح أخرى

وافتراض أن لديك read سيتم تنفيذ فورا بعد write هذا ليس صحيحا. قد يكتب عملية الكاتب إلى أنبوب بضع مرات قبل أن يتم اجه القراءة. سيتم إضافة البيانات المكتوبة إلى نهاية العازلة. بعبارة أخرى، قراءة، ولا حزمة الموجهة الكتابة. هم تيار المنحى. وهو ما يعني أن write فقط يضيف البيانات إلى المخزن المؤقت وread فقط يحصل أي شيء المتاحة لها.

وكيف حالك مزامنة مع الكاتب؟ تحتاج إلى مجرد قراءة ما تتوقع الخاص بك (تحديد 110 لقراءة ())

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