LINUX.ORG.RU

sock_creae() - непонятные инструкции


0

0

/* Compatibility.
This uglymoron is moved from INET layer to here to avoid
deadlock in module load.
*/
if (family == PF_INET && type == SOCK_PACKET) {
static int warned;
if (!warned) {
warned = 1;
printk(KERN_INFO "%s uses obsolete (PF_INET,SOCK_PACKET)\n",
current->comm);
}
family = PF_PACKET;
}

насколько я знаю, статические переменные обнуляются!
п.э. warned == 0 - по-любому, следовательно
следующая инструкция срабатывает( if (!warned) { ) всегда и ее
тело всегда выполняется. Тогда зачем эту проверку делать?
Да ещё и присваивать: warned = 1, ведь ее нигде больше не видно
(или я неправ?)?

объясните, пожалуйста.

anonymous

Извините, забыл сказать: это фрагмент кода из
linux-2.4.x/net/socket.c:sock_create(...)

anonymous
()
Ответ на: комментарий от anonymous

>насколько я знаю, статические переменные обнуляются! п.э. warned == 0 - по-любому

при таком обьявлении по стандарту языка С только до первого вызова ф-и а далее хранят значение между вызовами не обнулясь.

cvv ★★★★★
()

warned==0 при первом вызове функции. при этом срабатывает if(!warned), переменной warned присваивается значение 1 и при следующем вызове функции warned==1, поэтому if(!warned) не сработает и printk не выполнится.

т.е. этот кусок кода нужен для того, чтобы printk вызывался только при первом вызове этой функции.

вообще, для дальнейшего существования тебе понадобится лучше понять, что такое статические переменные.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.