Ответ 1
Оба значения 0 и 1 являются допустимыми значениями возврата и могут быть действительно возвращены, если приложение закрыло стандартные дескрипторы входного или выходного файла.
Может ли функция сокета в C возвращать 0 или 1 в качестве значения дескриптора сокета?
int socket(int domain, int type, int protocol);
В соответствии с man-страницей у меня есть:
RETURN VALUE
-1 is returned if an error occurs; otherwise the return value is a
descriptor referencing the socket.
Кажется, что это возможно, или, по крайней мере, на странице man не упоминается никаких зарезервированных значений. Разве написано где-то еще, что действительные дескрипторы сокета должны быть 2 или больше?
Я специально работаю на ядре linux 2.4.22, но мне любопытно узнать, для какой-либо реализации сокета на основе unix.
Оба значения 0 и 1 являются допустимыми значениями возврата и могут быть действительно возвращены, если приложение закрыло стандартные дескрипторы входного или выходного файла.
0 или 1 точно придет, если вы закрыли дескрипторы stdin или stdout. Это может произойти, потому что по ошибке вы можете передать переменную (скорее всего ту, в которой вы храните дескриптор сокета), в функцию закрытия сокета после инициализации. Поскольку переменная может быть инициализирована равной 0, это может привести к закрытию stdin.
Когда ваш процесс начинается, 0 - это stdin и 1 - stdout, но вы можете закрыть их, и, следовательно, вы можете вернуть эти FD
Единственными значениями, которые являются недопустимыми файловыми дескрипторами, являются те, которые меньше 0. -1 будут указывать на ошибку и будет задано errno. Вы никогда не должны видеть отрицательное значение, которое не равно -1.
Согласно странице руководства, да, это возможно.