Ветвление по сравнению с клоном на 2.6 ядрах Linux

Это - классик tr вариант использования, таким образом, самый простой путь:

tr -cs '[:digit:].' '[\n*]' < input > output

[:digit:]. аргумент указывает символы для соответствия (цифры и точка). [\n*] указывает символы для замены (замените все новой строкой). -c опция инвертирует первый аргумент, так как мы хотим все кроме цифр и точки. -s сжимает последовательные новые строки от второй строки в одну.

37
30.04.2015, 21:02
3 ответа

Вилка () была оригинальная система System Unix. Он может быть использован только для создания новых процессов, а не потоков. Кроме того, он портативный.

В Linux, клон () - это новый универсальный системный вызов, который можно использовать для создания новой резьбы выполнения. В зависимости от прошедших вариантов новая нить выполнения может придерживаться семантики процесса Unix, поток POSIX, что-то между ними, или что-то совершенно другое (как другой контейнер). Вы можете указать всевозможные варианты, диктующие ли память, дескрипторы файлов, различные пространства имен, обработчики сигналов и так далее, получают общие или копированные.

С клона () - это система SuperSet System, реализация Fork () System Call Shund в Glibc на самом деле вызовов клон () , но Это подробность реализации, о которых программистам не нужно знать. Фактический реальный Volk () системный вызов () System () системный вызов все еще существует в ядре Linux для причин обратной совместимости, даже если он стал избыточным, потому что программы, которые используют очень старые версии libc, или другой libc, помимо того, что Glibc может использовать его Отказ

Клон () также используется для реализации функции Pthread_Create () POSIX для создания потоков.

Портативные программы должны звонить вилкой () и Pthread_Create () , а не клон () .

52
27.01.2020, 19:36

Вилка () - это просто определенный набор флагов для системного вызова клона () . клон () достаточно общего, чтобы создать либо «процесс», либо «нить», либо даже странные вещи, которые где-то между процессами и потоками (например, различными «процессами», которые имеют одну таблицу дескриптов файлов файлов. ).

По сути, для каждого «типа» информации, связанной с контекстом выполнения в ядре, клон () дает вам выбор сглаживания этой информации или копирования. Темы соответствуют псевдониме, процессы соответствуют копированию. Указав промежуточные комбинации флагов на клона () , вы можете создавать странные вещи, которые не темы или процессы. Вы обычно не должны этого делать, и я представляю, что в развитии ядра Linux было несколько дискуссий о том, должен ли он позволить такому общему механизму как клон () .

6
27.01.2020, 19:36

Похоже, что в Linux 2.6 есть две clone () вещи.

Есть системный вызов:

int clone(int (*fn)(void *), void *child_stack,
          int flags, void *arg, ...
          /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );

This это «clone ()», описанный при выполнении клона man 2 .

Если вы прочтете эту страницу руководства достаточно внимательно, вы увидите следующее:

It is actually a library function layered on top of the
underlying clone() system call.

По-видимому, вы должны реализовать многопоточность, используя «библиотечную функцию», наложенную на системный вызов с одинаковым названием, сбивающим с толку.

Я написал короткую программу:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int ac, char **av)
{
    pid_t cpid;
    switch (cpid = fork()) {
    case 0:   // Child process
        break;
    case -1:  // Error
        break;
    default:  // parent process
        break;
    }
    return 0;
}

Скомпилировал ее с помощью: c99 -Wall -Wextra и запустил ее под strace -f , чтобы увидеть, что на самом деле делает разветвление системных вызовов. Я получил это из strace на машине Linux 2.6.18 (процессор x86_64):

20097 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b4ee9213770) = 20098
20097 exit_group(0)                     = ?
20098 exit_group(0)

В выходных данных strace не появляется вызов "fork". Вызов clone () , который отображается в выходных данных strace , имеет аргументы, сильно отличающиеся от аргументов man-page-clone. child_stack = 0 , поскольку первый аргумент отличается от int (* fn) (void *) .

Похоже, что системный вызов fork (2) реализован в терминах реального clone () , как и «библиотечная функция» clone () реализован. real clone () имеет набор аргументов, отличный от man-page-clone.

Проще говоря, оба ваших явно противоречивых утверждения о fork () и clone () верны. Однако задействованный «клон» другой.

10
27.01.2020, 19:36

Теги

Похожие вопросы