|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : mitrohin a.s. 2:5020/400 05 Feb 2006 10:36:50 To : All Subject : ftpd accept loop -------------------------------------------------------------------------------- ehlo. в оригинале сделано так. ftpd.c ... /* * Loop forever accepting connection requests and forking off * children to handle them. */ while (1) { FD_COPY(&defreadfds, &readfds); nfds = select(maxfd + 1, &readfds, NULL, NULL, 0); if (nfds <= 0) { if (nfds < 0 && errno != EINTR) syslog(LOG_WARNING, "select: %m"); continue; } pid = -1; for (i = 1; i <= *ctl_sock; i++) if (FD_ISSET(ctl_sock[i], &readfds)) { addrlen = sizeof(his_addr); fd = accept(ctl_sock[i], (struct sockaddr *)&his_addr, &addrlen); if (fd >= 0) { if ((pid = fork()) == 0) { /* child */ (void) dup2(fd, 0); (void) dup2(fd, 1); close(ctl_sock[i]); } else close(fd); } } if (pid == 0) break; } ... если ctl_sock - это массив, надо полагать вида [0]=<длина>,[1]..[<длина>]=<дескрипторы> то почему такая странная обработка. imho как минимум должно быть что-то подобное. ... /* * Loop forever accepting connection requests and forking off * children to handle them. */ while (1) { FD_COPY(&defreadfds, &readfds); nfds = select(maxfd + 1, &readfds, NULL, NULL, 0); if (nfds <= 0) { if (nfds < 0 && errno != EINTR) syslog(LOG_WARNING, "select: %m"); continue; } for (i = 1; i <= *ctl_sock; i++) if (FD_ISSET(ctl_sock[i], &readfds)) { addrlen = sizeof(his_addr); fd = accept(ctl_sock[i], (struct sockaddr *)&his_addr, &addrlen); if (fd >= 0) { if ((pid = fork()) == 0) { /* child */ (void) dup2(fd, 0); (void) dup2(fd, 1); close(ctl_sock[i]); close(fd); goto Lchild; } close(fd); } else syslog(LOG_ERR, "accept: %m"); } } ... /swp --- ifmail v.2.15dev5.3 * Origin: BSPU InterNetNews site (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/3499eb322421.html, оценка из 5, голосов 10
|