Недавно я читаю CSAPP. В разделе 10.9, он отметил, что стандарт ввода/вывода не должны использоваться с гнездом по причинам, следующим образом:Ограничение стандартного ввода-вывода C и почему мы не можем использовать стандартный ввод-вывод C с разъемами
(1) Ограничения стандартного ввода/вывода
Ограничение 1: Input функции после выходных функций. Функция ввода не может следовать за выходной функцией без промежуточного вызова для fflush, fseek, fsetpos или перемотки назад. Функция fflush освобождает буфер , связанный с потоком. В последних трех функциях функция Unix I/O lseek используется для сброса текущей позиции файла.
Ограничение 2: Функции выхода следующих функций ввода. Функция вывода не может следовать за входной функцией без промежуточного вызова в fseek, fsetpos или перемотке, если только функция ввода не встречает конец файла.
(2) Нельзя использовать функцию lseek на сокете.
Вопрос 1: Что произойдет, если я нарушу ограничение? Я написал фрагмент кода, и он отлично работает.
Вопрос 2: Для того, чтобы ходить по ограничению 2, один подход заключается в следующем:
File *fpin, *fpout;
fpin = fdopen(sockfd, "r");
fpout = fdopen(sockfd, "w");
/* Some Work Here */
fclose(fpin);
fclose(fpout);
В тексте книги, он сказал,
Закрытие уже закрытого дескриптора в резьбовую программа - это рецепт для катастрофы .
Почему?
Благодарим вас за подробный объяснение. Но я не совсем понимаю «асинхронное использование цикла событий». – feirainy