Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как работает функция fork 
V
    Опции темы
redwhite90
Дата 10.12.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



разбираюсь с клиент-серверным прилодением. дошёл до примера с функцией fork(). Не понимаю как она работает - какой дочерний процесс она создаёт, что в нем происходит...
Код

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    int sock, listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 1);
    
    while(1)
    {
        sock = accept(listener, NULL, NULL);
        if(sock < 0)
        {
            perror("accept");
            exit(3);
        }
        
        switch(fork())
        {
        case -1:
            perror("fork");
            break;
            
        case 0:
            close(listener);
            while(1)
            {
                bytes_read = recv(sock, buf, 1024, 0);
                if(bytes_read <= 0) break;
                send(sock, buf, bytes_read, 0);
            }

            close(sock);
            _exit(0);
            
        default:
            close(sock);
        }
    }
    
    close(listener);

    return 0;
}

PM MAIL   Вверх
boostcoder
Дата 10.12.2011, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



redwhite90, в линукс, есть такая замечательная фишка, как маны ;)
>man fork

Добавлено через 3 минуты и 16 секунд
Цитата(redwhite90 @  10.12.2011,  22:44 Найти цитируемый пост)
        switch(fork())
        {
        case -1:
            perror("fork");
            break;
            
        case 0:
            close(listener);
            while(1)
            {
                bytes_read = recv(sock, buf, 1024, 0);
                if(bytes_read <= 0) break;
                send(sock, buf, bytes_read, 0);
            }
            close(sock);
            _exit(0);
            
        default:
            close(sock);
        }

здесь, создается клон процесса, который, закрывает listener ибо он(клон) работает только с конкретным дескриптором. в твоем случае это sock. и естественно, ему не нужна возможность аксептать.

Добавлено через 7 минут и 9 секунд
Цитата(redwhite90 @  10.12.2011,  22:44 Найти цитируемый пост)
какой дочерний процесс она создаёт

создает клон себя же.
т.е. к примеру, у тебя приложение зовется "serv". после выполнения fork(), создастся еще один одноименный процесс, который от родительского унаследует данные/переменные. результат fork() используется в клонированном процессе для того чтоб клон мог себя идентифицировать как клон, и выполнять работу клона, а не родительского процесса.

PM WWW   Вверх
redwhite90
Дата 10.12.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



и при этом они выполняются параллельно?
PM MAIL   Вверх
boostcoder
Дата 10.12.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



конечно
PM WWW   Вверх
redwhite90
Дата 11.12.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



есть ещё 1 тупой вопрос.
а эти маны раскиданы по всему инету или есть сайт типа msdn, где всё есть?
PM MAIL   Вверх
fish9370
Дата 11.12.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(redwhite90 @  11.12.2011,  13:55 Найти цитируемый пост)
есть ещё 1 тупой вопрос.а эти маны раскиданы по всему инету или есть сайт типа msdn, где всё есть?



в консоли линукса набери команду

Код

man man





--------------------
undefined
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 11.12.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



redwhite90, ты это выполнять не пробовал?
Цитата(boostcoder @  10.12.2011,  22:46 Найти цитируемый пост)
>man fork


PM WWW   Вверх
redwhite90
Дата 11.12.2011, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



даже не догадывался, что так делать надо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.