LINUX.ORG.RU

Если серверный сокет создан как блокирующий, то естественно что процесс засыпает до тех пор, пока кто-то не попытается законектиться.

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

Этого можно избежать создав неблокирующий сокет.

Banshee
()

Mogesh ustanovit' svou masku processa, gde zablokiruesh signaly, no lutshe ispol'zovat' deistvitel'no ne blokiruuschii socket. K primeru:

sigset_t old_sigmask, new_sigmask; sigfillset(&new_sigmask);

// set new mask if (sigprocmask(SIG_BLOCK, &new_sigmask, &old_sigmask) == -1) { perror("Procmask:"); exit(1); } // some operations .......

// restore old mask if (sigprocmask(SIG_SETMASK, &old_sigmask, NULL) == -1) { perror("Procmask:"); exit(1); }

No v etom sluchae poterjaesh signaly, inogda eto vagno:)

TvN
()

Sorry zapostil slegka ne tak, razbivka poterjalas':))

sigset_t old_sigmask, new_sigmask; 
sigfillset(&new_sigmask); 

// set new mask 
if (sigprocmask(SIG_BLOCK, &new_sigmask, &old_sigmask) == -1) 
{ 
   perror("Procmask:"); 
   exit(1); 
} 
// some operations 
....... 

// restore old mask 
if (sigprocmask(SIG_SETMASK, &old_sigmask, NULL) == -1) 
{ 
    perror("Procmask:"); 
    exit(1); 
} 

TvN
()

А не проще ли while ((sock = accept (main_sock, (struct sockaddr *)&addr, &alen)) < 0 && errno == EINTR) ; вместо просто accept ()

anonymous
()

Можно задать флаг SA_RESTART в sigaction тогда после сигнала ядро рестартует системный вызов.

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