LINUX.ORG.RU

read "man 2 clone"

anonymous
()

Ну, вообще говоря, ее не надо использовать. Если вам нужно создать процесс, используйте fork(); если вам нужны треды -- используйте pthread_create(). Так что clone() нужен вам только если вы пишете собственную реализацию POSIX Threads (соответсвтенно и примеры использования можно найти в исходниках glibc). А в прикладной программе в 99,99% случаев clone() не место

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

Да на приактике дали задание с синхронизацией процессов, а процесс надо создать при помощи clone(), если можно не давайте ссылки на man pages, я уже там был

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

Как уже было написано выше, процесс надо создавать с помощью fork.

nobody ★★
()

Clone(), ИМХО, лучше того, что под Линуксом называется threads.
Кончно, никакой портируемости, но, ИМХО, от портируемости один вред,
каждая прога должна писатся под свою ОС.
Когда используется clone() у каждого "потока" может быть свой
обработчик сигналов, чего нельзя сделать на pthread().

Вот простенький примерчик из кусков реально работающей программы
(kernel 2.4.24).
Создаем поток, даем ему приоретет реального времени
(блокировка только на вводе/выводе) и ждем его выхода...


int my_thread(void * a)
{ 
   {
       struct sched_param sp;
       sp.sched_priority = 1;
       if ( sched_setscheduler(0, SCHED_RR, &sp) == -1 )
           return 55;
   }
   .....
}

int main()
{
    int clon_pid, i;
    {
        struct rlimit rlim;
        void *stp, *stpo, *stpn;
        if ( getrlimit(RLIMIT_STACK, &rlim) ){
            printf("Can't get limit of stack size");
            exit(5); /* Thread problems */
        }
        stpo = sbrk(0);
        stp = sbrk(rlim.rlim_cur);
        stpn = sbrk(0);
        if ( ((char*)stpn - (char*)stpo) != rlim.rlim_cur ){
            printf("Can't set data segment size");
            exit(5); /* Thread problems */
        }
        if ( (clon_pid = clone(my_thread, stpn, SIGCHLD|CLONE_FS|CLONE_VM|CLONE_FILES, (void *)&clon_pid)) == -1 ){
          printf("Can't clone");
          exit(5); /* Thread problems */
        }
    }

    waitpid(clon_pid, &i, 0);
    printf("Tread is dead. Exit code %i", i);
    exit(0);
}

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

> Кончно, никакой портируемости, но, ИМХО, от портируемости один вред, каждая прога должна писатся под свою ОС.

Любопытное мнение, ничего не скажешь. Слышал бы вас Билли Гейтс, вот он бы обрадовался... :)

По поводу использования clone() -- ну и кто даст гарантии, что в следующей версии ядра это будет работать? непортабильные интерфейсы они на то и непортабильные, что, вообще говоря, могут спокойно в любой момент поменяться

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

Это уже оффтоп, но все же продолжу...

>По поводу использования clone() -- ну и кто даст гарантии, что в следующей версии ядра это будет работать?

А программирование, вобще, такая штука, что никаких гарантий там нет. Первая заповедь программирования "Никогда не бойтесь начать все с начала".

Вот, например, man snprintf().

>snprintf and vsnprintf do not write more than size bytes (including the trailing '\0'), and return -1 if the output was truncated due to this limit. (Thus until glibc 2.0.6. Since glibc 2.1 these functions follow the C99 standard and return the number of characters (exclud ing the trailing '\0') which would have been written to the final string if enough space had been available.)

То есть раньше хочу в строку из 10 байт "напечатать" 11 байт, получу в ответ -1, а сейчас получу 11... Вот уж в чистом виде непортабильность.

Лично встречал достаточно старого софта (которому лет 5-10), написан на Си, а текущем gcc/g++ его не соберешь.

Радость Билли мне не понятна, между версиями Виндоз очень много различий. ИМХО мелкомягкие достаточно сильно озабочены тем, чтобы очередное их "художество" заработало на все поддерживаемых в данный момент Виндозах.

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

> Лично встречал достаточно старого софта (которому лет 5-10), написан на Си, а текущем gcc/g++ его не соберешь.

Вот именно. Потому что те, кто его писали, не думали о переносимости.

Пример с snprintf не вполне удачен, потому что до декабря 1999 года функция snprintf была сугубо нестандартной. Кроме того, то, что функции семейства printf/scanf в разных системах возвращают разные значения --- хорошо известная вещь.

> Первая заповедь программирования "Никогда не бойтесь начать все с начала".

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

> озабочены тем, чтобы очередное их "художество" заработало на все поддерживаемых в данный момент Виндозах.

ню-ню

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

mky (*) (17.11.2004 23:51:09):

> ...от портируемости один вред, каждая прога должна писатся под свою ОС.

Если "прога" -- дипломная работа, то согласен на все 100 %.

Для прочих видов "прог" сие утверждение, очевидно, не есть истина.

Даже если ты пишешь "прогу" под конкрентную машину, ты не знаешь, сколько времени она будет нужна и до каких апгрейтов доживет.

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