Как я бужу выбор () на сокете близко?

Этот ответ только относится версия 1.x Мерзавца. Для версии 2.x Мерзавца см. другие ответы.

<час>

Сводка:

  • git add -A этапы все изменения

  • git add . этапы новые файлы и модификации, без удалений

  • git add -u модификации этапов и удаления, без новых файлов

<час>

Деталь:

git add -A эквивалентно git add .; git add -u.

важный момент приблизительно git add . - то, что он смотрит на рабочее дерево и добавляет все те пути к подготовленным изменениям, если они или изменяются или новые и не проигнорированные, он не подготавливает действий 'комнаты'.

git add -u взгляды весь уже отслеженные файлы и этапы изменения в тех файлах, если они отличаются или если они были удалены. Это не добавляет новых файлов, это только подготавливает изменения в уже отслеженных файлах.

git add -A удобный ярлык для того, чтобы сделать обоих из тех.

можно проверить различия с чем-то вроде этого (обратите внимание, что для версии 2.x Мерзавца вывод для git add . git status будет отличаться):

git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial

echo OK >> change-me
rm delete-me
echo Add me > add-me

git status
# Changed but not updated:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git add .
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
# Changed but not updated:
#   deleted:    delete-me

git reset

git add -u
git status

# Changes to be committed:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git reset

git add -A
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
#   deleted:    delete-me
7
задан Newton Falls 14 March 2014 в 19:54
поделиться

5 ответов

Как справиться с EBADF в select () :

int fopts = 0;
for (int i = 0; i < num_clients; ++i) {
    if (fcntl(client[i].fd, F_GETFL, &fopts) < 0) {
        // call close(), FD_CLR(), and remove i'th element from client list
    }
}

В этом коде предполагается, что у вас есть массив клиентских структур, которые имеют члены "fd" для дескриптора сокета. Вызов fcntl () проверяет, "жив ли" ли сокет, и если нет, мы делаем все необходимое, чтобы удалить мертвый сокет и связанную с ним информацию о клиенте.

1
ответ дан 6 December 2019 в 23:11
поделиться

Трудно комментировать, когда видишь только небольшую часть слона, но, может быть, вы слишком усложняете вещи?

Предположительно у вас есть какая-то структура для отслеживания каждого сокета и его информации (например, осталось время получить ответ). Вы можете изменить цикл select (), чтобы использовать тайм-аут. В нем проверьте, не пора ли закрыть розетку. Сделайте то, что вам нужно для закрытия, и не добавляйте его в набор fd в следующий раз.

0
ответ дан 6 December 2019 в 23:11
поделиться

Используйте тайм-аут для выбора, и если все последовательности готовности к чтению / готовности к записи / наличия ошибок пусты (относительно этого сокета), проверьте, был ли он закрыт.

-1
ответ дан 6 December 2019 в 23:11
поделиться

Обычно я просто помечаю сокет для закрытия в другом потоке, а затем, когда select () возвращается из активности или тайм-аута, я запускаю этап очистки и закрываю все мертвые соединения и обновляю fd_set . Выполнение этого любым другим способом открывает вам условия гонки, в которых вы отказались от соединения, так же, как select () наконец распознал для него некоторые данные, затем вы закрываете его, но другой поток пытается обработать данные, которые были обнаружены, и получает расстроен, обнаружив, что соединение закрыто.

Да, и poll () обычно лучше, чем select (), с точки зрения отсутствия необходимости копировать столько данных.

9
ответ дан 6 December 2019 в 23:11
поделиться

Если вы используете poll (2), как предлагается в других ответах, вы можете использовать статус POLLNVAL, который по сути является EBADF, но для каждого дескриптора файла, а не для всей системы вызов как есть для select (2).

0
ответ дан 6 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: