Этот ответ только относится версия 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
Как справиться с 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 () проверяет, "жив ли" ли сокет, и если нет, мы делаем все необходимое, чтобы удалить мертвый сокет и связанную с ним информацию о клиенте.
Трудно комментировать, когда видишь только небольшую часть слона, но, может быть, вы слишком усложняете вещи?
Предположительно у вас есть какая-то структура для отслеживания каждого сокета и его информации (например, осталось время получить ответ). Вы можете изменить цикл select (), чтобы использовать тайм-аут. В нем проверьте, не пора ли закрыть розетку. Сделайте то, что вам нужно для закрытия, и не добавляйте его в набор fd в следующий раз.
Используйте тайм-аут для выбора, и если все последовательности готовности к чтению / готовности к записи / наличия ошибок пусты (относительно этого сокета), проверьте, был ли он закрыт.
Обычно я просто помечаю сокет для закрытия в другом потоке, а затем, когда select () возвращается из активности или тайм-аута, я запускаю этап очистки и закрываю все мертвые соединения и обновляю fd_set . Выполнение этого любым другим способом открывает вам условия гонки, в которых вы отказались от соединения, так же, как select () наконец распознал для него некоторые данные, затем вы закрываете его, но другой поток пытается обработать данные, которые были обнаружены, и получает расстроен, обнаружив, что соединение закрыто.
Да, и poll () обычно лучше, чем select (), с точки зрения отсутствия необходимости копировать столько данных.
Если вы используете poll (2), как предлагается в других ответах, вы можете использовать статус POLLNVAL, который по сути является EBADF, но для каждого дескриптора файла, а не для всей системы вызов как есть для select (2).