- 1
- 2
- 3
- 4
- 5
if (errno==EINTR) while (errno==EINTR)
{
fseek(fr,loffset,SEEK_SET);
fgets(line_buffer,len,fr);
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+139.3
if (errno==EINTR) while (errno==EINTR)
{
fseek(fr,loffset,SEEK_SET);
fgets(line_buffer,len,fr);
}
sacc - система биллинга для squid
Одной проверки на ошибку - видимо, недостаточно
guest 11.11.2009 17:22 # −5
xaionaro 11.11.2009 17:47 # 0
xaionaro 12.11.2009 07:49 # 0
bildja 13.11.2009 02:16 # 0
xaionaro 13.11.2009 09:37 # 0
Вообще вы меня удивляете, у gcc достаточно серьёзные алгоритмы оптимизации и было бы странно, если бы gcc не замечал двойной проверки на "(errno==EINTR)".
bildja 13.11.2009 12:41 # 0
xaionaro 13.11.2009 22:22 # 0
xaionaro 13.11.2009 22:52 # 0
guest 15.11.2009 21:27 # 0
xaionaro 16.11.2009 16:29 # 0
guest 16.11.2009 23:16 # 0
Вообще то я не понимаю разговоров по поводу gcc.. да естественно компилятор не идиот - и оптимизирует как надо, вопрос в другом - как можно было такое вообще написать.. И так же понятно, что можно просто обойтись while в данном случае - первая проверка инварианта цикла даст требуемое поведение.
Pencioner 13.01.2010 13:45 # 0
errno у нас статическая глобальная переменная устанавливающаяся во время ошибки системных вызовов, и вызов fgets() внутри цикла каждый раз ее устанавливает заново. Смысл кода в том чтобы пытаться выполнить пока не пройдет без прерывание эта операция. Так как fgets() использует системные вызовы, если возниктет прерывание, мы получим errno==EINTR опять, и вынуждены будем повторить чтение с данного места файла.
Я бы даже сказал что это код с повышенной надежностью... но чего-то слегка не хватает, наверное проверки результата fgets() на EOF...
Pencioner 13.01.2010 13:53 # 0
сорьк
фсе понял... посыпаю голову пеплом...
я чет подумал что наезды по поводу того шо while лишний...
а там if ненадо, ой ненадо
аааааа! был невнимателен....