2017-02-23 38 views
-1

Я очень новичок в системном программировании на C, я смотрю на страницу man для clone(), у нее есть куча флагов. Это также дает вам пример:C Системное программирование бит и значения флаговых бит 0:

pid = clone(childFunc, stackTop, CLONE_NEWUTS | SIGCHLD, argv[1]); 

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

Во-вторых, какова логика заявления

CLONE_NEWUTS | SIGCHLD 

Что на самом деле здесь происходит? Я знаю побитовое ИЛИ, но что он делает с этими флагами и что является результатом ORing двух флагов?

+0

Я не понимаю, почему нижний предел? –

ответ

1

Первый вопрос:

Смотрите "sched.h" вашей системы для CLONE_NEWUTS (вероятно, 0x04000000), и "signal.h" для SIGCHLD (вероятно 20). Если вы посмотрите на «sched.h» вы можете обнаружить, что маска сигнала (CSIGNAL) устанавливаются в 0x000000FF, впадающий вопрос 2 ...

Второй вопрос:

Со страниц человека Linux (man7.org):

Если CLONE_NEWUTS установлен, а затем создать процесс в новом UTS имен, чьи идентификаторы инициализируются дублируя идентификаторы из пространства имен UTS вызывающего процесса. Если этот флаг не установлен, то (как и fork (2)) процесс , созданный в том же пространстве имен UTS, что и вызывающий процесс. Этот флаг предназначен для реализации контейнеров.

И

младший байт флагов содержит номер сигнала терминации, который посылается родителю, когда ребенок умирает. Если этот сигнал указан как что-либо иное, кроме SIGCHLD, тогда родительский процесс должен указать параметры __WALL или __WCLONE, ожидая, когда ребенок будет ждать (2). Если сигнал не указан, родительский процесс не сигнализируется, когда ребенок завершается.

Я бы предположил, что это делает именно это - создает клонированный процесс в новом пространстве имен UTS и сигнализирует о завершении родительского процесса с SIGCHLD.