|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Valentin Nechayev 2:5020/400 31 Jan 2003 11:47:11 To : Dmitry Fedorov Subject : Re: научный вопрос -------------------------------------------------------------------------------- >>> Dmitry Fedorov wrote: >>>>Вот грабля тут есть - не всегда close() завершается успешно с закрытием >>>>дескриптора, бывают (хотя крайне редко) и более извратные позы. > DF>> Hикакой грабли, rtfm close - он всегда закрывает дескриптор, > DF>> даже если вернул ошибку. >> SUSv3/Posix.1-2001: DF> Да, признаюсь, ложная память. DF> Hо во всех linux kernel сделанно именно так, как я написал. DF> Что, по моему, правильно. DF> EBADF и EINTR не считаем - так и должно быть. А остальное - нелепость. Тогда, если оно действительно закрыло, то всё равно должно возвращать 0, а не ошибку. А вот возврат ошибки при закрытии дескриптора - вот это будет действительно полнейшая нелепость и грубая диверсия. Представьте себе, что дескриптор закрыли, но вернули ошибку, а программа, написанная в расчёте на нормальное стандартное поведение, думает, что закрытие не состоялось, и тред пытается закрыть ещё раз (стандартное действие; см. например, INN - где fork() пытаются сделать 10 раз подряд пока не удастся;)). В это время в соседнем треде делают open(), по которому выдаётся тот же номер дескриптора. Первый тред повторяет свой close() и закрывает новооткрытое другого треда. Hравится сценарий? ;)) Так что, если Вы правы в том, что Linux способен закрыть, но вернуть ошибку, я поднимаю скандал о том, что на этой платформе вообще нельзя работать. Давайте перепроверим на всякий случай. ;) -netch- --- ifmail v.2.15dev5 * Origin: Dark side of coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/7368f2f83d90.html, оценка из 5, голосов 10
|