سؤال

كيف يمكنني إلغاء تحديد علامة تعيين بالفعل باستخدام FCNTL؟

على سبيل المثال، يمكنني ضبط المقبس على الوضع غير المشدود باستخدام

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK)

الآن، أريد إلغاء تحديد علامة O_Nonblock.

حاولت fcntl (sockfd، f_setfl، أعلام | ~ o_nonblock). أعطاني خطأ einval

هل كانت مفيدة؟

المحلول

int oldfl;
oldfl = fcntl(sockfd, F_GETFL);
if (oldfl == -1) {
    /* handle error */
}
fcntl(sockfd, F_SETFL, oldfl & ~O_NONBLOCK);

لم تختبر، ولكن نأمل أن يساعد هذا. :-)

نصائح أخرى

val = fcntl(fd, F_GETFL, 0);
flags = O_NONBLOCK;
val &= ~flags;
fcntl(fd,F_SETFL,val);

إذا كنت تحب هذا، فستكون مجموعة O_NONBLOCK بالفعل. هنا، تحتوي الأعلام على الأعلام التي تريد إلخيها. بعد الانتهاء من التشغيل و (&)، مرة أخرى، عليك تعيين العلم باستخدام القيمة في Val. آمل أن يكون هذا سيساعدك.

الرمز التالي سوف يقوم بإخلاص العلم، على سبيل المثال، علامة o_nonblock:

if ((flags = fcntl(fileno(sockfd), F_GETFL, 0)) < 0) {
    perror("error on F_GETFL");
}
else {
    flags &= ~O_NONBLOCK;
    if (fcntl(fileno(sockfd), F_SETFL, flags) < 0) {
        perror("error on F_SETFL");
    }
    else {
        /* O_NONBLOCK set without errors. continue from here */
        }
}

يعتبر

حاول مخيم جميع الأعلام:

fcntl(sockfd, F_SETFL, 0);

أيضا أو جي الأعلام مع ~O_NONBLOCK لا يوجد أي فائدة، تحتاج إلى ذلك، لأن ما تريده هو إلغاء تغيير Bit (S) O_NONBLOCK.

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