Лекция №2
int clone (int (*fn) (void*),
void *stack,
int flags,
void *args)
Создает новый процесс в самом широком понимании.
1) указатель на функцию, которая будет запущена как новый поток
2) указатель на стек для нового процесса (конец стека)
3) флаги
4) аргумент функции
CLONE_PARENT
CLONE_FS – клонировать файловую систему (клонируется корневой или текущий каталог), если флага нет, то С получит копию, если есть, то В и С имеют общие корневой и текущий каталоги.
CLONE_FILES – общими становятся таблицы файлов.
CLONE_SIGHAND – общая обработка сигналов
CLONE_VFORK – если установлен, то запускается процесс, а родительский процесс приостанавливается до остановки дочернего (выход по exit или вызов любой функции exec *)
CLONE_VM – общей становится виртуальная память, в этом случае можно не указывать PARENT, FS, FILES (фактически создается поток).
pid_t wautpid (pid_t pid,
int *status,
int flags)
Ожидает завершение процесса(ов)
1) Если pid > 0, то мы ждем завершение процесса с указанным pid номером.
Если pid = 0, ждем завершения любого дочернего процесса, который принадлежит к той же группе процессов, что и вызывающий.
|
|
Если pid = -1, ждем завершение любого дочернего процесса.
Если pid < -1, ждем завершение любого дочернего процесса из группы, номер которой равно модулю числа pid.
2) Указатель на нашу переменную, в которую будет записан код завершения процесса.
3) либо 0
либо WNOHANG – не вешаться, если установлен, то функция проверяет на завершенность процессы, не ожидая их завершения.
Результат > 0 – номер процесса, который завершился;
Результат = 0 – нет завершившихся процессов (дочерние есть, но они не завершены);
Результат = -1 – ошибка.
pid_t wait (int *st) – ждет завершения дочернего процесса.
pid_t getpid() – получить номер процесса.
pid_t getppid() – получить номер родителя.