2014-12-11 5 views
0

Я не понимаю следующую строку. sockfd1 и sockfd2 - розетки.Что означает эта «максимальная» линия?

max = (sockfd1 < sockfd2 ? sockfd2 : sockfd1); 

Я использую эту строку для выбора:

//Initialisation du fd_set  
FD_ZERO(&readfds); 
FD_SET(sockfd1, &readfds); 
FD_SET(sockfd2, &readfds); 
max = (sockfd1 < sockfd2 ? sockfd2 : sockfd1); 

//Le select()  
select(max+1, &readfds, NULL, NULL, NULL); 

Спасибо за вашу помощь :)

+2

Сравнение числовых значений двух файловых дескрипторов, как правило, не имеет смысла ... у вас есть еще какой-то контекст? – FatalError

+0

Вам нужно изучить C Basic trernary http://www.cprogramming.com/reference/operators/ternary-operator.html – Riad

+0

Я положил контекст в сообщение выше;) – Danvdb

ответ

4

Тернарный оператор ?: оценивает свой первый аргумент, и если это правда, он возвращает вторую, в противном случае третью. Так что если sockfd1 < sockfd2, результатом будет sockfd2, в противном случае sockfd1 - другими словами, max получает более подробный файловый дескриптор сокета.

1

Он устанавливает max равным большему из sockfd1 и sockfd2.

1

Это то же самое, как

if (sockfd < sockfd) 
    max = sockfd2; 
else 
    max = sockfd1; 

Тройной оператор ?: является только syntaxic sugar

0

Там используется так называемая условная или тройная оператор:

(sockfd1 < sockfd2 ? sockfd2 : sockfd1); 

Если выражение

sockfd1 < sockfd2 

верно, то значение оператора sockfd2 в противном случае sockfd1

Таким образом max будет назначено максимальное значение между двумя значениями.

От C Standard (6.5.15 Условный оператор)

4 Первый операнд; существует точка последовательности между , ее оценка и оценка второго или третьего операнда (в зависимости от того, что оценивается). Второй операнд оценивается только в том случае, если сначала сравнивает не равные 0; третий операнд оценивается, только если первое сравнивается с 0; результатом является значение второго или третьего операнда (в зависимости от того вычисляется), преобразуется к типу, описанному below.110) *

2

Похоже, что все другие ответы объяснить тройной оператор. Я предполагаю, что вы запутались, потому что этот код сравнивает два сокета в численном порядке.

В Linux/Unix socket() - это функция создания сокета, но она возвращает целое число. Все остальные данные, которые ОС должна отправлять и получать данные в сокете, например, ее IP-адрес, хранятся внутри ядра. Когда вы вызываете API как send(), вы передаете это число, и ядро ​​использует его, чтобы найти всю другую релевантную информацию о сокете в своих собственных структурах данных.

Файлы, трубы и другие материалы в Unix ведут себя одинаково. Эти целые числа называются файловыми дескрипторами.

Таким образом, этот код сравнивает числовые значения двух файловых дескрипторов. Я не могу придумать, почему это было бы полезно, кроме определения произвольного порядка на двух сокетах. Численное значение дескрипторов файлов не имеет смысла.

+1

Это может быть полезно, если, например, сокеты были получены с использованием '' socketpair (2) '] (http://linux.die.net/man/2/socketpair), и вы пытаетесь определить, какая из них, но поскольку сокеты симметричны в любом случае, вы действительно должны чтобы следить за этой информацией самостоятельно. – Kevin

+0

Это интересно. Я никогда не слышал о «socketpair (2)» раньше. Но я также думаю, что ваше дело квалифицируется как «определение произвольного порядка на двух сокетах». ':)' – japreiss

+0

Я помещал контекст в сообщение выше;) – Danvdb

Смежные вопросы